Я плачу за строительство по умолчанию здесь, и если да, могу ли я избежать этого - PullRequest
4 голосов
/ 06 июля 2011

В случае, когда T стоит дорого, я хотел бы знать, плачу ли я за построение по умолчанию в следующем случае (думаю, что я делаю)

std::function< T() > make_t;
std::vector< T > t( 100000 );
std::generate( t.begin(), t.end(), make_T );

Если я должен заплатить за это, могу ли я избежать этого? Я хотел написать что-то вроде

std::function< T() > make_t;
std::vector< T > t;
t.reserve( 100000 );
std::generate( t.begin(), t.end(), make_T );

Но это не работает, потому что он не перемещает t.end () в конец того, что зарезервировано. Является ли следующее безопасным / желательным / правильным?

std::function< T() > make_t;
std::vector< T > t;
t.reserve( 100000 );
std::generate( t.begin(), t.begin() + 100000, make_T );

Я также подумал, что мог бы использовать back_inserter, но интерфейс подходит для того, что у меня есть (у меня есть функция, которая генерирует новый объект T каждый раз, когда к нему обращаются, а не пара итераторов для диапазона).

Решения C ++ 0x предпочтительнее решений C ++ 03 (т. Е. Те, которые используют новый стандарт, если есть лучший способ сделать это там), предпочтительнее решения, которое должно использовать boost.

Ответы [ 3 ]

8 голосов
/ 06 июля 2011
std::function< T() > make_t;
std::vector< T > t;
int const count = 100000;
t.reserve( count );
std::generate_n( std::back_inserter(t), count, make_T );

std::back_inserter в <iterator>.

3 голосов
/ 06 июля 2011

Вы можете исправить свое второе решение с помощью итератора std::back_inserter, который делает для вас push_back:

std::vector< T > t;
t.reserve(100000);
std::generate_n(std::back_inserter(t), 100000, make_t);
0 голосов
/ 06 июля 2011

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

Я бы заставил вектор удерживать shared_ptr<T> вместо простого T, тогда все остальное легко.Это также облегчает перемещение объектов позже, если вам это понадобится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...