3

所以我有一个字符串类型的轻量级:

typedef boost::flyweight< std::string, boost::flyweights::intermodule_holder > SymbolName_t;

我想将这个实例推送到它们的向量中,但是天真的方法行不通:

void PushSome( std::vector < SymbolName_t >& list)
{
  std::string& str = getSomeStr();
  list.push_back( str ); // <--- won't compile
}

所以我添加了一个临时构造函数:

void PushSome( std::vector < SymbolName_t >& list)
{
  std::string& str = getSomeStr();
  list.push_back( SymbolName_t(str) ); // <--- compiles ok
}

我的问题是:考虑到语言的限制,这种方法是最优的吗?以其他方式实现这一点有什么好处,例如,通过提供静态转换运算符?我不认为通过非显式构造函数进行隐式转换是一个有效的选项,因为这需要修改boost::flyweight模板

4

2 回答 2

3

如果你有一个 C++11 编译器,你可以使用emplace_back而不是push_back,这样就不需要复制了。

于 2012-03-26T03:39:45.307 回答
1

根据我对 C++ 的了解,您的上述代码可能是您最好的选择,因为您正在传递对列表的引用(不调用赋值或复制构造函数),获取对字符串的引用(同样,没有赋值或复制构造函数),然后将新构建的推SymbolName_t送到您的列表中。不幸的是,STL 容器对其参数的副本进行操作,因此复制构造函数或赋值运算符(我不记得哪个std::list此处使用)将在那时被调用。其他选项可能包括转换运算符,但列表仍必须构造初始对象,然后将其复制到 STL 容器。即使使用不同的 STL 容器,这仍然是正确的。所以转换运营商不会真的给你买任何东西,恕我直言。

您上面的代码(“编译正常”块)可能是您最好的选择。在 STL 容器的限制下,我想不出更有效的方法。您也许可以通过使用shared_ptrto 来购买一些性能SymbolName_t,但是boost:flyweight就管理内存而言应该已经进行了优化,如果有很多重复的字符串,我不确定这会给您带来多少收益。

于 2012-03-26T02:45:41.300 回答