【问题标题】:How to use iterator to iterate a 2D vector? [closed]如何使用迭代器迭代二维向量? [关闭]
【发布时间】:2013-08-02 08:51:06
【问题描述】:

全部

我在 C++ STL 中使用向量来存储我的数据。我将它们传入和传出函数。然而,随着数据量的增长,程序越来越慢。因此,我将代码更新为“迭代器版本”。

我想要实现的是使用迭代器来传递、返回和迭代 STL 向量

我现在可以使用一维向量进行操作,就像操作数组一样。但是,当涉及到二维向量时,我有点困惑。

谁能告诉我如何使用 STL 迭代器迭代 2D 向量的简单代码示例

非常感谢。

问候

【问题讨论】:

  • 别忘了你可以通过 const ref 传递东西以避免复制。你能发布一个二维向量的代码示例吗?它是一个向量>?
  • -1,您的问题要求提供示例代码; stackoverflow 上已经提供了该问题的示例代码
  • @doctorlove 非常感谢您的回复。现在我弄清楚了问题并让它正常运行。然而,又提出了一个问题:如何使用迭代器获取向量的大小?
  • 不可能。但是你为什么还需要它呢?
  • @doctorlove 我使用它是为了提高我的代码的速度性能。我使用的数据块通常非常大。因此传递数据变量非常非常非常耗时。因此,我虽然通过迭代器可以帮助我。您提到了 const 参考。我可以知道这是什么想法吗?

标签: c++ vector stl iterator


【解决方案1】:

您说您的基本问题是性能,对吗? 您认为这是由于复制造成的。 也许可以为您的问题提供更简单的解决方案:

  • 检查向量是否可以通过 (const) 引用传递
  • 检查 shared_ptr 是否有意义
  • 考虑移动语义是否有帮助
  • 也许编译器版本或实现会阻止返回值优化

【讨论】:

    【解决方案2】:

    如果您需要知道向量的大小,并且有两个迭代器it1it2

    std::distance(it1, it2);
    

    会告诉你他们之间的距离。如果它们是beginend,这将是大小

    如果你有类似的功能

    int work(std::vector<int> items)
    {
      //...
    }
    

    复制矢量项目,因此将使用更多 RAM 并花费更长的时间。 相反,发送 const ref 不会复制向量。让它const 阻止你改变它,这可能对你没有帮助,但你没有发布任何代码,所以我不知道你想做什么。

    int work(const std::vector<int> & items)
    {
      //...
    }
    

    【讨论】:

      【解决方案3】:

      嗯,它已经在stackoverflow的某个地方了

      但如果你不想在这里搜索,那就是:

      std::vector<std::vector<int> >  vec{ {1,2,3},{4,5,6}};
      
      //Simplest Way:- (C++11)
      
      for(auto row:vec)
      {
        for(auto col:row)
         std::cout<<col<< " ";
        std::cout<<std::endl;
      }
      
      //OR Using iterator
      std::vector<std::vector<int> >::iterator r;
      std::vector<int>::iterator c;
      for (r = vec.begin(); r != vec.end(); r++) {
          for (c = r->begin(); c != r->end(); c++) {
              std::cout<<*c<< " ";
          }
          std::cout<<std::endl;
      }
      

      只能在同一容器的两个迭代器之间获取distance

      std::vector<int>::iterator s = v2.begin(); //Can be any start
      std::vector<int>::iterator e = v2.end(); // Can be any end
      
      std::cout<<"Distance :"<<std::distance(s,e)<<std::endl;
      

      【讨论】:

      • 嗨,P0W。我以另一种方式完成了迭代 2D 矢量:vector&lt;vector&lt;int&gt;&gt;::iterator iter; iter = vec.begin();for(int i = 0; i &lt; 3; i++) { for(int j = 0; j &lt; 4; j++) cout&lt;&lt;iter[i][j]&lt;&lt;' '; cout&lt;&lt;endl; } 抱歉,我是这个论坛的新手,对格式一无所知。
      • @user2633803 不要硬编码 3 和 4。使用迭代器
      • @doctorlove 我已经进行了测试以查看迭代器和索引之间的速度差异。原来迭代器没有竞争力。
      • 你做错了什么
      • @doctorlove 对我来说“非常错误”?那是?
      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多