我是否支付默认施工费用,如果可以,我可以避免

时间:2011-07-06 00:40:50

标签: c++ boost c++11

如果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对象而不是一对范围的迭代器)。 / p>

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

3 个答案:

答案 0 :(得分:8)

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>

答案 1 :(得分:3)

您可以使用std::back_inserter迭代器修复您的第二个解决方案,它为您执行push_back

std::vector< T > t;
t.reserve(100000);
std::generate_n(std::back_inserter(t), 100000, make_t);

答案 2 :(得分:0)

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

我将向量保持shared_ptr<T>而不是普通T,其余的很容易。如果你需要它,它还有助于以后移动物体。