【问题标题】:Iterate i'th row in vector of vectors [closed]迭代向量向量中的第 i 行 [关闭]
【发布时间】:2017-06-03 20:10:07
【问题描述】:

我使用向量向量创建了一个二维数组

vector< vector<int> > vvi;

我可以使用以下迭代器来迭代整个向量:

std::vector< std::vector<int> >::iterator row; 
std::vector<int>::iterator col; 

for (row = vvi.begin(); row != vvi.end(); ++row)
{ 
     for (col = row->begin(); col != row->end(); ++col)
     { 
        std::cout << *col; 
     } 
} 

我需要像这样遍历任何第 i 行,而不是遍历整个二维数组,但它不起作用

std::vector< std::vector<int> >::iterator row; 
std::vector<int>::iterator col;
row = vvi[i];
for (col = row->begin(); col != row->end(); col++) {
        std::cout << *col;          
}

我该如何解决这个问题。任何帮助将不胜感激!

【问题讨论】:

  • auto &amp; row = vvi[row_index]; 然后row.begin();
  • 您收到一条错误消息,我想。您是否难以理解信息?
  • @VTT 你的代码和我的代码有什么区别?我想我也在做同样的事情。
  • @AnandGupta operator[] of vector 返回对项目的引用,而不是对项目的迭代器。
  • @DrewDormann 是的,我收到错误消息,我该如何解决这个问题。还有其他方法吗?

标签: c++ multidimensional-array vector iterator


【解决方案1】:

在您的代码中,row 是一个迭代器,因此您不能将 vvi[i] 分配给它。 在您的情况下,这可以工作:

#include <iterator>
// ...
std::vector<std::vector<int> >::iterator row = vvi.begin();
std::advance(row, i);

for (std::vector<int>::iterator col = row->begin(); col != row->end(); ++col) {
  std::cout << *col << std::endl;
}

你也可以做一些简单的事情,比如(下面的 C++11):

for (auto const& x : vvi[i]) { std::cout << x << std::endl; }

如果您不想使用 range-for 语法,另一种解决方案可能是:

auto const& row = vvi[i];
for (auto col = row.cbegin(); col != row.cend(); ++col)
{
  std::cout << *col << std::endl;
}

请注意,这里我使用了cbegin()cend() 而不是begin()end()。 (如果您不确定其中的差异,请对迭代器和 const_iterators 进行一些研究。)

最后一点:我在两个示例中都使用了增量运算符作为前缀 (++col)(就像您在第一个示例中所做的那样):在您的情况下,不需要后缀版本提供的开销. (即使这是一个微妙的性能加,它只是没有必要。)

真心希望我能帮上忙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多