странное поведение при изменении размера вектора

#c #stl #vector #resize

#c #stl #вектор #изменение размера

Вопрос:

У меня есть следующий код. Интересная часть заключается в том, что если я раскомментирую resize() в vector, то вместо входного значения 5 будет получено 10 чисел. Я использую eclipse с mingw и gcc в Windows xp. Разве итератор не должен использоваться только для 5 элементов?

 #include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
//#include "stdio.h"
using namespace std;

template <typename T>
void print_coll(T t)
{
    typename T::iterator iter = t.begin();
    while (iter != t.end() )
    {
        cout << *iter << " ";
          iter;
    }
    cout << endl;
}

int main()
{
    int size;
    cin >> size;
    vector<int> numbers;
//    numbers.resize(size);

    for ( int i = 0 ; i < size;   i ) {
        int r = (rand() % 10);
        numbers.push_back(r);
    }
    print_coll(numbers);

}
  

Ответ №1:

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

Комментарии:

1. @Kiran, совсем не глупо — мне всегда приходится останавливаться и перепроверять себя, когда я хочу reserve . Похожие имена, похожие функции всегда будут вызывать путаницу.

Ответ №2:

 numbers.resize(size);
  

Это добавляет size 0 к вектору.

 for ( int i = 0 ; i < size;   i ) {
    int r = (rand() % 10);
    numbers.push_back(r);
}
  

И это добавляет size случайные значения к вектору.

Вероятно, вы reserve не resize хотели. reserve не изменяет «видимый» размер вектора, он изменяет только внутренний размер хранилища, используемого вектором, resize однако изменяет «видимый» размер.