如何使用迭代器遍历向量并访问元素值



我开始使用迭代器遍历向量。通常,我会用这个来遍历一个向量:

for( int i=0; i< vector.size(); i++){
cout<<vector[i];
}

我学到了如果我想使用迭代器,我必须做这样的事情:

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

但是,如果我想访问迭代器所指向的值,我该怎么做呢?

我试着这样做:

int temp = *col;

但这会导致错误

从不兼容的类型'std::__1::vector<int,std::__1::分配器<int>>'

我之所以尝试这样做,是因为我有一个2d向量,我试图找到各个列的总和。

您显示的代码是正确的对于1D矢量。但是,您说您实际上使用的是一个2D向量,在这种情况下,外部向量的元素本身就是向量,因此取消引用外部向量的迭代器可以为您提供对内部向量的引用。这正是错误消息所抱怨的——您正试图将内部vector分配给int,这显然是行不通的。您必须单独迭代内部向量,就像使用索引而不是迭代器时一样,例如:

std::vector<std::vector<int> > rows_vec;
...
/*
for(size_t row_idx = 0; row_idx < rows_vec.size(); ++row_idx){
std::vector<int> &row_vec = rows_vec[row_idx];
int sum_cols = 0;
for(size_t col_iter = 0; col_idx < row_vec.size(); ++col_idx){
sum_cols += row_vec[col_idx];
}
// use sum_cols as needed...
}
*/
std::vector<std::vector<int> >::iterator row_iter;
for(row_iter = rows_vec.begin(); row_iter != rows_vec.end(); ++row_iter){
std::vector<int> &row_vec = *row_iter; 
std::vector<int>::iterator col_iter;
int sum_cols = 0;
for(col_iter = row_vec.begin(); col_iter != row_vec.end(); ++col_iter){
sum_cols += *col_iter;
}
// use sum_cols as needed...
}

如果您使用的是C++11或更高版本,使用基于范围的for循环可以大大简化:

std::vector<std::vector<int>> rows_vec;
...
for(auto &row_vec : rows_vec){
int sum_cols = 0;
for(int col_val : row_vec){
sum_cols += col_val;
}
// use sum_cols as needed...
}

使用标准的std::accumulate()算法可以进一步简化,例如:

std::vector<std::vector<int>> rows_vec;
...
for(auto &row_vec : rows_vec){
int sum_cols = std::accumulate(row_vec.begin(), row_vec.end(), 0);
// use sum_cols as needed...
}

最新更新