首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在c++中使用二维数组的迭代器?

如何在c++中使用二维数组的迭代器?
EN

Stack Overflow用户
提问于 2020-04-28 21:41:26
回答 3查看 248关注 0票数 1

我想对2D数组使用迭代器,但我不知道如何使用。

我的目的是访问列,而不是行。

我发现为了访问行,我可以使用这个auto it=begin(arr);,但我认为这不是正确的方法,不管它看起来是如何工作的。

代码语言:javascript
运行
复制
#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

EN

回答 3

Stack Overflow用户

发布于 2020-04-28 21:56:21

如果你想遍历一个列,你可以这样做:

代码语言:javascript
运行
复制
for(auto it = std::begin(arr); it != std::end(arr); it++)
    cout << **it;

这将打印第一列。

要按列顺序迭代数组,您需要的命名方法如下:

代码语言:javascript
运行
复制
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编译器标志。

两个附注:

  • 您缺少随机引擎的种子:

代码语言:javascript
运行
复制
  #include <time.h>
  //...
  srand(time(0)); //seed
  //...

  • 您不应该使用using namespace std;

Why is "using namespace std;" considered bad practice?.

票数 1
EN

Stack Overflow用户

发布于 2020-04-28 22:18:53

这里有一对简单的迭代器,它们以行为主和列为主的顺序进行。

代码语言:javascript
运行
复制
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); }
票数 1
EN

Stack Overflow用户

发布于 2020-04-28 21:51:48

你可以通过指针算术来访问该列。

代码语言:javascript
运行
复制
cout<<"Column : "<<*(*it+1)<<endl;

这里,1是列号。

这里有一个真实的例子:https://gcc.godbolt.org/z/WXKLCk

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61481647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档