迭代向量向量中的第 i 行

Iterate i'th row in vector of vectors

本文关键字:向量 迭代      更新时间:2023-10-16

我使用向量的向量

创建了一个2D数组
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; 
     } 
} 

我不需要穿越整个2D阵列,而需要像这样遍历任何一行,但它不起作用

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;          
}

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

在您的代码中, 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; }

如果您不想使用范围的语法,则另一种替代解决方案可能是:

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

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

最后一句话:在两个示例中,我都将增量运算符用作前缀(++col((就像您在第一个示例中一样(:在您的情况下,无需上空版本提供的开销。(即使这是一个微妙的性能,也不是必需的。(

真正希望我能提供帮助。