В большинстве случаев вы должны оставить выделение в покое, если вы не знаете количество элементов заранее, чтобы вы могли зарезервировать правильное количество места.
По крайней мере, в каждом случае, о котором я знаю, std::vector::size()
просто возвращает сохраненное значение, поэтому оно имеет постоянную сложность. Теоретически стандарт C ++ позволяет делать это иначе. Есть причины разрешить иное для некоторых других контейнеров, в первую очередь std::list
, и вместо того, чтобы делать особый случай для них, они просто рекомендуют постоянное время для всех контейнеров вместо того, чтобы требовать его для любых. Я не могу представить себе vector::size
, который насчитывал бы элементы, хотя - я почти никогда не существовал.
P.S., более простой способ сделать то, что делает ваш код выше, выглядит примерно так:
std::vector<string> split(std::string const &input) {
vector<string> ret;
istringstream buffer(input);
copy(istream_iterator<string>(input),
istream_iterator<string>(),
back_inserter(ret));
return ret;
}
Редактировать: IMO, Стандартная библиотека C ++ , автор Николас Йосуттис - прекрасный справочник по таким вещам.