2016-01-20 2 views
2

У меня есть этот код:Ошибка при добавлении ИНТ элементов из вектора с ++

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

'test_vector [* итератор];' большой код запах –

+0

что у вас есть UB, вы должны иметь 'сумма = сумма + * v; 'вместо' sum = sum + test_vector [* v]; ' –

+0

Итератор не является индексом. – jxh

ответ

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 (int x : test_vector) { 
    sum = sum + x; 
    std::cout << sum << " "; 
} 

Учтите, что операторы < и [] поддерживаются только для случайных аксессуаров итераторы. Таким образом, в общем-то лучше записать условие в цикл следующим образом

for (v = test_vector.begin(); v != test_vector.end(); ++v) { 
           ^^^^^^^^^^^^^^^^^^^^^^ 
+0

'v [0]' aka 'iterator [index]' сомнительно (не работает, если идентификатор итератора не указатель) –

+1

@ DieterLücking Этот оператор работает с любым итератором произвольного доступа. –

+0

Спасибо за этот урок (полезно?) –

0

Неверный код test_vector[*v]. Что вы там делаете, вы разыскиваете итератор и получаете целое число (так как ваш вектор является вектором ints). Теперь вы получаете доступ к элементу, используя это целое число в качестве индекса, и, конечно, поступаете в случайную ячейку памяти, выходите из границ массива и запускаете неопределенное поведение.

Вы используете итераторы правильно в двух других циклах, поэтому я предполагаю, что это только опечатка.

2
for (v = test_vector.begin(); v < test_vector.end(); ++v) { 
     sum = sum + *v; 
     std::cout << sum << " "; 
} 

- правильный код.

Или же, но немного короче и C++ 11-иш:

for (const int item: test_vector) { 
    sum += item; 
    std::cout << sum << " "; 
} 

Или даже

sum = std::accumulate(test_vector.begin(), test_vector.end(), 0); 
1

Использование test_vector[*v]; будет вне диапазона и вызвать undefined behavior.

Это должно быть изменено на:

for (v = test_vector.begin(); v < test_vector.end(); ++v) { 
    sum = sum + *v; 
    std::cout << sum << " "; 
} 

Или sum += *v; для более короткой версии.

Смежные вопросы