向后迭代向量元素

Posted

技术标签:

【中文标题】向后迭代向量元素【英文标题】:iterating over vector elements backwards 【发布时间】:2020-12-08 22:10:16 【问题描述】:

我正在尝试实现一个小程序,它向后迭代二维向量并添加元素的值。

如果该元素已经添加,那么我想用99 覆盖向量的值。

例如,如果攀登次数为四,则添加的程序点的值应为 5,最后的向量应如下所示

1, 1 ,1,

99, 1, 1,

99(should start here), 99, 99 

但我不断收到分段错误,我不知道我是否错误地向后迭代向量。

这是我的完整代码

#include <iostream>
#include <vector>
using namespace std;

int main()

    vector<vector<int>> vect
       3, //finish here
     
        1, 1 ,1,
     
        2, 1, 1,
     
        1, 1, 1  //start here
    ;

    int points = 0;
    
    for (int i = 0; i < vect.size(); i++)
    
        for (int j = 0; j < vect[i].size(); j++)
        
            cout << vect[i][j] << " ";
         
        cout << endl;
    
  
   int visited = 99;
   int number_of_climbs = 4;
  
   for(int i = 4; i >= 0; i--)
       for (int j = 0; j < number_of_climbs; j++)
       
            if(vect[i][j] != 99)
            
              points += vect[i][j];
              vect[i][j] = 99;;
              continue;
            
        

    return 0;

【问题讨论】:

vect[4] 超出范围访问...for(int i = 4; 应该是for(int i = 3; 然后你会遇到jvect[0]的问题。 也许是时候了解一下迭代器,尤其是反向迭代器,或者range-based for 【参考方案1】:

向后循环也总是让我绊倒,尤其是当我不小心使用unsigned int 声明循环时。您的向后循环接近正确,但可以简化为:

for (int i = vect.size() - 1; i >= 0; --i)

    for (int j = vect[i].size() - 1; j >= 0; --j)
    
    

您需要从 size() - 1 开始,因为唯一可用的索引是 [0, size)(即不包含大小),因此在 4 个元素的向量中,即 0、1、2 和 3(并且您需要从在 3) 处,这可能是您的分段错误的原因,因为您在 4 开始初始循环,所以它立即越界。

在内部循环中,您可以看到我们仅使用每个向量的大小来说明向量的大小不同。

也可以使用反向迭代器,但迭代器可能会让人们感到困惑:

for (auto outer = vect.rbegin(); outer != vect.rend(); ++outer)

    for (auto inner = outer->rbegin(); inner != (*outer).rend(); ++inner)
    
    

注意我已经展示了访问迭代器的两种方法,使用 it-&gt;(*it). 在内部循环中,您只需使用 *inner 来获取向量所持有的实际值,所以如果您只是有std::cout &lt;&lt; *inner &lt;&lt; " "; 会以相反的顺序在一行上打印二维向量。

即使我们反向循环,我们仍然使用++

【讨论】:

以上是关于向后迭代向量元素的主要内容,如果未能解决你的问题,请参考以下文章

可以通过 foreach 向后迭代吗?

使用迭代器 C++ 删除对象类型的向量元素

通过迭代器访问另一个向量内的向量元素?

使用迭代器查找向量的中间元素 - C++

在迭代算法中使用 Rcpp 加速替换列表和向量的元素是不是合法?

使用交换和弹出进行迭代时擦除向量中的元素