C++ 我是否在这里支付默认施工费用?如果是,我可以避免吗

C++ 我是否在这里支付默认施工费用?如果是,我可以避免吗,c++,boost,c++11,C++,Boost,C++11,在T建造成本很高的情况下,我想知道我是否为以下情况下的默认建造付费(我想我会) std::functionmake\T; std::vectorT(100000); std::generate(t.begin(),t.end(),make\t); 如果我必须付钱,我能避免吗?我想写一些像这样的东西 std::function< T() > make_t; std::vector< T > t; t.reserve( 100000 ); std::generate( t.

在T建造成本很高的情况下,我想知道我是否为以下情况下的默认建造付费(我想我会)

std::functionmake\T;
std::vectorT(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 );
std::functionmake\T;
std::vectorT;
t、 储备金(10万美元);
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 );
std::functionmake\T;
std::vectorT;
t、 储备金(10万美元);
std::generate(t.begin(),t.begin()+100000,make\t);
我还认为我可能能够使用back_插入器,但接口正适合我所拥有的(我有一个函数,每次访问它时都会生成一个新的T对象,而不是对某个范围的迭代器进行访问)


C++0x解决方案优先于C++03解决方案(即,如果有更好的方法可以利用新标准的解决方案),而不是需要使用boost的解决方案。

如果您害怕,您将为默认构造付费。不过,您应该通过在特定平台上检查生成的汇编代码来证明这一点

我想让向量保持
共享的
而不是普通的
T
,那么剩下的就简单了。如果您后来发现需要,它也有助于移动对象。

std::functionmake\T;
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::vectorT; int const count=100000; t、 储备(计数); std::generate_n(std::back_inserter(t)、count、make_t);

std::back\u插入器
位于
中,您可以使用
std::back\u插入器
迭代器修复第二个解决方案,迭代器为您执行
推回

std::vector< T > t;
t.reserve(100000);
std::generate_n(std::back_inserter(t), 100000, make_t);
std::vectorT;
t、 储备金(10万美元);
std::generate_n(std::back_inserter(t),100000,make_t);

reserve
不会做您认为的事情-您的代码被破坏,因为它取消了对未定义迭代器的引用!
T
搬家便宜吗?使用C++0x移动语义,情况可能没有您想象的那么糟。我想是用
reserve
加上反向插入器。嘿,C++0x有“back emplacer”吗?或者你的意思是有一个std::emplace\u插入器,我找不到它是否存在。是的,我指的是用于算法的迭代器版本。我还没想过这一点,我也不知道这是否有意义。嘿,你听说过背部插入器的“定位”版本吗?@Kerrek:有什么意义吗
emplace
直接从构造函数参数列表中构造到容器中,但是由于
make\u T
返回一个对象,因此您只能使用复制或移动构造函数进行放置。因此,只要确保类型T是有效的可移动的,
push_back(T&&)
应该像假设的
emplace_迭代器那样工作。我想。内联后,假设没有副作用,也许两者都可以消除临时性,但我认为正式禁止临时性的唯一方法是抛弃
make\u T
,不带任何参数地放置。@Kerrek没有任何问题。它打破了对称性,但没有失去多少功能——史蒂夫已经介绍过了。(如果你想讨论的话,我正在聊天。)对不起,没有参数是错误的,我应该用
make\T
构造其返回值的参数说。即,
t.reserve(count);对于(int i=0;i。但是我有点激动,提问者甚至没有问如何消除临时性,而
generate\u n
已经解决了如何使
插入器回到
位置的问题。“通过检查生成的汇编代码”-通常更快地使用一对
std::cout
s或断点。。。。
std::vector< T > t;
t.reserve(100000);
std::generate_n(std::back_inserter(t), 100000, make_t);