#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
однако изменяет «видимый» размер.