изменение размера вектора странное поведение - PullRequest
2 голосов
/ 16 мая 2011

У меня есть следующий код. Интересная часть, если я раскомментирую resize () для вектора, он печатает 10 чисел для входного значения 5. Я использую 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);

}

Ответы [ 2 ]

9 голосов
/ 16 мая 2011

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

4 голосов
/ 16 мая 2011
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 однако изменяет «видимый» размер.

...