从向量c ++添加int元素时出错

时间:2016-01-20 20:20:58

标签: c++ vector stl iterator

我有这段代码:

// 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等;

4 个答案:

答案 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) {
                              ^^^^^^^^^^^^^^^^^^^^^^