2014-02-08 4 views
1

я ожидал, что сНеожиданное поведение станд :: вектор :: = оператор в C++

v2 = v1 

содержание v1 копируется в v2.

Что я испытываю, так это то, что содержимое v1 равно , а не, скопированное в v2, если содержимое v1 не было инициализировано в конструкторе.

Просто увидеть код:

#include <iostream> 
#include <vector> 

using namespace std; 

int main (void) { 
    vector<int> v1; // if I use vector<int> v1(10,0); it just works fine 
    vector<int> v2; 
    v1.reserve(5); 
    v2.reserve(5); 
    for (int i = 0; i < 5; i++) v1[i] = i*i; 
    v2 = v1; 
    for (int i = 0; i < 5; i++) { 
    cout << "v1[" << i << "] = " << v1[i] << endl; 
    cout << "v2[" << i << "] = " << v2[i] << endl; 
    } 
    return 0; 
} 

Результат исполнения является:

v1[0] = 0 
v2[0] = 0 
v1[1] = 1 
v2[1] = 0 
v1[2] = 4 
v2[2] = 0 
v1[3] = 9 
v2[3] = 0 
v1[4] = 16 
v2[4] = 0 

Почему это странное поведение?

ответ

7

Ваши надежды верны. v2 = v1; копирует все элементы v1 в v2. Проблема в том, что вы получаете доступ к своим векторам за пределами границ. Это undefined поведение.

std::vector::reserve не увеличивает свой размер. Он просто выделяет больше памяти для увеличения размера по мере необходимости. Вместо этого вам нужно позвонить std::vector::resize, инициализировать вектор нужного размера или вызвать push_back в цикле.

Обратите внимание, что вы должны использовать переменную-член size(), итераторы begin() и end(), или цикл для цикла для итерации по вектору. Это гарантирует, что вы не получите доступ за пределы.

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