我想对2D数组使用迭代器,但我不知道如何使用。
我的目的是访问列,而不是行。
我发现为了访问行,我可以使用这个auto it=begin(arr);
,但我认为这不是正确的方法,不管它看起来是如何工作的。
#include <iostream>
#include <iterator>
using namespace std;
int main(){
int arr[3][3];
for (int i=0;i!=3;i++)
for (int j=0;j!=3;j++)
arr[i][j]=rand()%9;
for (int i=0;i!=3;i++)
for (int j=0;j!=3;j++){
cout<<arr[i][j]<<' ';
if (j==2)
cout<<'\n';
}
auto it=begin(arr);
cout<<**it<<endl;
这是正确的吗?
提前感谢:D
发布于 2020-04-28 21:56:21
如果你想遍历一个列,你可以这样做:
for(auto it = std::begin(arr); it != std::end(arr); it++)
cout << **it;
这将打印第一列。
要按列顺序迭代数组,您需要的命名方法如下:
for (size_t i = 0; i < std::size(arr); i++) {
for (auto it = std::begin(arr); it != std::end(arr); it++) {
cout << *(*it + i) << " ";
}
cout << endl;
}
这将按列顺序打印数组。请注意,std::size
仅在C++17之后可用,您可能需要使用std=c++17
编译器标志。
两个附注:
#include <time.h>
//...
srand(time(0)); //seed
//...
using namespace std;
发布于 2020-04-28 22:18:53
这里有一对简单的迭代器,它们以行为主和列为主的顺序进行。
class row_iterator
{
int (&arr)[3][3];
std::size_t pos;
public:
row_iterator(int (&arr)[3][3], std::size_t pos) : arr(arr), pos(pos) {}
row_iterator& operator++() { ++pos; return *this; }
row_iterator operator++(int) { auto that = *this; ++pos; return that; }
int & operator*() { return arr[pos / 3][pos % 3]; }
int * operator->() { return &arr[pos / 3][pos % 3]; }
friend bool operator==(row_iterator lhs, row_iterator rhs) { return (lhs.arr == rhs.arr) && (lhs.pos == rhs.pos); }
friend bool operator!=(row_iterator lhs, row_iterator rhs) { return !lhs == rhs; }
};
row_iterator row_begin(int (&arr)[3][3]) { return row_iterator(arr, 0); }
row_iterator row_end(int (&arr)[3][3]) { return row_iterator(arr, 9); }
class col_iterator
{
int (&arr)[3][3];
std::size_t pos;
public:
col_iterator(int (&arr)[3][3], std::size_t pos) : arr(arr), pos(pos) {}
col_iterator& operator++() { ++pos; return *this; }
col_iteratoroperator++(int) { auto that = *this; ++pos; return that; }
int & operator*() { return arr[pos % 3][pos / 3]; }
int * operator->() { return &arr[pos % 3][pos / 3]; }
friend bool operator==(col_iterator lhs, col_iterator rhs) { return (lhs.arr == rhs.arr) && (lhs.pos == rhs.pos); }
friend bool operator!=(col_iterator lhs, col_iterator rhs) { return !lhs == rhs; }
};
col_iterator col_begin(int (&arr)[3][3]) { return col_iterator(arr, 0); }
col_iterator col_end(int (&arr)[3][3]) { return col_iterator(arr, 9); }
发布于 2020-04-28 21:51:48
你可以通过指针算术来访问该列。
cout<<"Column : "<<*(*it+1)<<endl;
这里,1是列号。
这里有一个真实的例子:https://gcc.godbolt.org/z/WXKLCk
https://stackoverflow.com/questions/61481647
复制相似问题