这感觉像是一个新手问题,但我似乎无法弄明白。我想迭代std :: vector中的项目。目前我使用这个循环:
for (unsigned int i = 0; i < buffer.size(); i++) {
myclass* var = buffer.at(i);
[...]
}
然而,我意识到我实际上想以相反的顺序迭代它:从最后开始并以我的方式运行到0.所以我尝试使用这个迭代器:
for (unsigned int i = buffer.size()-1; i >= 0; i--) {
myclass* var = buffer.at(i);
[...]
}
但是通过简单地用旧的替换旧行(当然还有重新编译),然后它从正确运行并迭代代码,它会导致程序在第一次遇到此行时崩溃,错误:
http://i43.tinypic.com/20sinlw.png
接着是“[程序]已停止工作”对话框。
该程序还返回退出代码3,根据Code :: Blocks,(如果要相信this article)表示ERROR_PATH_NOT_FOUND:系统找不到指定的文件。
有什么建议吗?我只是在我的for循环中遗漏了一些可能导致某种内存问题的东西吗?返回代码3或文章是误导性的,它实际上并不意味着“未找到路径”?
答案 0 :(得分:3)
无符号整数始终>> = 0.此外,从0递减到大数。
答案 1 :(得分:2)
当i == 0
(即应该是最后一次迭代)时,减量i--
会导致i
回绕到unsigned int
的最大可能值。因此,条件i >= 0
仍然成立,即使您希望循环停止。
要解决此问题,您可以尝试这样的方法,它维护原始循环逻辑,但会产生递减i
:
unsigned int i;
unsigned int size = buffer.size();
for (unsigned int j = 0; j < size; j++) {
i = size - j - 1;
或者,由于std::vector
定义了rbegin
和rend
方法,因此您可以使用迭代器:
for(typename std::vector<myclass *>::reverse_iterator i = buffer.rbegin(); i != rend(); ++i)
{
myclass* var = *i;
// ...
}
(可能存在小的语法错误 - 我没有编译器方便)
答案 2 :(得分:0)
#include <vector>
using namespace std;
int main() {
vector<int> buffer = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (vector<int>::reverse_iterator it = buffer.rbegin(); it != buffer.rend(); it++) {
//do your stuff
}
return 0;
}