【问题标题】:how to traversing through vector using iterator and accessing element value?如何使用迭代器遍历向量并访问元素值?
【发布时间】:2020-07-26 15:16:40
【问题描述】:

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

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'

我正在尝试这个,因为我有一个 2d 向量并且我正在尝试查找各个列的总和。

【问题讨论】:

  • 这个问题中显示的代码不符合stackoverflow.com对minimal reproducible example的要求,因此这里的任何人都不太可能最终确定问题,而最多只能猜测.这个问题必须是edited 来展示一个最小的例子,不超过一两页代码(“最小”部分),其他人都可以剪切/粘贴、编译、运行和重现所描述的问题( “可重现”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。

标签: c++ xcode c++14


【解决方案1】:

您显示的代码是正确的...对于一维向量。但是,您说您实际上是在使用 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 或更高版本,则可以使用 range-based for loops 大大简化:

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

【讨论】:

  • 谢谢,这帮了很大的忙,但是如果我想在二维向量中分别找到行和列的总和,我该怎么做呢?
  • 显然,您必须声明一个整数变量,然后让内部循环递增该变量。然后为外循环的每次迭代重复该操作。请参阅我刚刚对答案所做的编辑。
  • 对不起,我有点困惑。如果可以的话,你能通过一些代码解释一下,以便我更好地理解吗?谢谢。
  • 感谢您的帮助,我可以得到列的总和,但我怎样才能得到行的总和?我试图为行迭代器运行一个基于范围的循环,但它只是给了我看起来的 cols 总和
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多