向后迭代向量元素
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;
然后你会遇到j
vect[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->
或 (*it).
在内部循环中,您只需使用 *inner
来获取向量所持有的实际值,所以如果您只是有std::cout << *inner << " ";
会以相反的顺序在一行上打印二维向量。
即使我们反向循环,我们仍然使用++
【讨论】:
以上是关于向后迭代向量元素的主要内容,如果未能解决你的问题,请参考以下文章