我想为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;
它是否正确?先谢谢了
最佳答案
这是一对简单的迭代器,以行优先和列优先的顺序排列。
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); }
关于c++ - 如何在C++中将迭代器用于2D数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61481647/