我有这段代码:
// Example program
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> test_vector;
std::vector<int>::iterator v;
int test = 1;
int sum = 0;
for (int i = 0; i < 10; i++) {
test = test * 2;
test_vector.push_back(test);
}
for (v = test_vector.begin(); v < test_vector.end(); v++) {
std::cout << *v << " ";
}
std::cout << std::endl;
std::reverse(test_vector.begin(), test_vector.end());
for (v = test_vector.begin(); v < test_vector.end(); v++) {
std::cout << *v << " ";
}
std::cout << std::endl;
for (v = test_vector.begin(); v < test_vector.end(); ++v) {
sum = sum + test_vector[*v];
std::cout << sum << " ";
}
return 0;
}
这很简单,我有一个向量,用一些元素填充,而不是反向,最后尝试添加所有元素。
输出是这样的:
2 4 8 16 32 64 128 256 512 1024
1024 512 256 128 64 32 16 8 4 2
0 0 0 0 0 0 0 4 68 324
问题是:在sum
所在的最后一个循环中我做错了什么?
我希望它像1024 + 512 + 256
等;
答案 0 :(得分:2)
for (v = test_vector.begin(); v < test_vector.end(); ++v) {
sum = sum + *v;
std::cout << sum << " ";
}
是正确的代码。
或者,相同但更短一点,更多C ++ 11-ish:
for (const int item: test_vector) {
sum += item;
std::cout << sum << " ";
}
甚至
sum = std::accumulate(test_vector.begin(), test_vector.end(), 0);
答案 1 :(得分:1)
使用test_vector[*v];
将超出范围并导致undefined behavior。
这应该改为:
for (v = test_vector.begin(); v < test_vector.end(); ++v) {
sum = sum + *v;
std::cout << sum << " ";
}
或sum += *v;
更短的版本。
答案 2 :(得分:0)
您的代码test_vector[*v]
不正确。你在做什么是你取消引用一个迭代器并得到一个整数(因为你的向量是一个int的向量)。现在,您使用此整数作为索引访问元素,当然,到达随机内存位置,走出数组边界并触发未定义的行为。
你正在其他两个循环中正确使用迭代器,所以我想,这只是一个错字。
答案 3 :(得分:0)
矢量只有10个元素
for (int i = 0; i < 10; i++) {
^^^^^^
test = test * 2;
test_vector.push_back(test);
}
因此,向量的有效索引范围是0-9
但是在这个循环中
for (v = test_vector.begin(); v < test_vector.end(); ++v) {
sum = sum + test_vector[*v];
^^^^^
std::cout << sum << " ";
}
此表达式test_vector[*v]
中的索引值可能超出了向量的有效索引范围。
你可以写例如
for (v = test_vector.begin(); v < test_vector.end(); ++v) {
sum = sum + *v;
^^^^
std::cout << sum << " ";
}
或者你甚至可以写
for (v = test_vector.begin(); v < test_vector.end(); ++v) {
sum = sum + v[0];
^^^^
std::cout << sum << " ";
}
如果您的编译器支持基于for循环的范围,则编写
更简单for ( int x : test_vector ) {
sum = sum + x;
std::cout << sum << " ";
}
考虑到运营商&lt;和[]仅支持随机访问迭代器。所以一般来说,最好用以下方式在for循环中写入条件
for (v = test_vector.begin(); v != test_vector.end(); ++v) {
^^^^^^^^^^^^^^^^^^^^^^