std :: basic_string vs sequence容器中的push_back()

时间:2016-02-09 09:59:49

标签: c++ c++11 stl

序列容器(dequelistvector)具有push_back的以下签名:

void push_back (const value_type& val);
void push_back (value_type&& val);

basic_string push_back具有以下签名:

void push_back(CharT ch);

请注意缺少参考:参数为CharT而不是const CharT&CharT&&

basic_string X满足standards say的要求,该要求规定应将容器(称为push_backt定义为接受:

  • X::value_type,类型rv
  • 的左值或常量值
  • X::value_type,类型disabled edit box / read-only text label
  • 的非常量右值

我不是很清楚,如何 有谁看到怎么样?感谢。

2 个答案:

答案 0 :(得分:3)

我认为这是因为CharT类型的简单性。它确实需要由reference传递,因为reference没有传递,所以不需要const关键字。

在相反的std::vectorstd::list中可能包含非常昂贵的复制对象。因此,它应该由reference传递,然后const是必不可少的。

答案 1 :(得分:2)

TLDR:值参数接受r值和l值,因此函数签名满足标准中的要求,定义函数将是非常愚蠢的签名传递参考。

关于为什么选择pass-by-value而不是引用传递的问题(为什么std::basic_string应该满足序列容器的要求本身是另一个讨论):

99.999%的用例(charwcharchar32_t,...等)按值传递CharT至少与传递一样有效在绝大多数情况下,通过引用和(忽略内联),使用引用的效率甚至更低,因为它添加了间接并且指针比大多数类似char的类型更大(确切的权衡取决于编译器,调用会议,建筑等)。

我个人意见:如果你有一个用例,那么

  • 通过引用传递CharT更有效率
  • 你真的关心性能差异
  • std::vector<CharT>不够好
无论如何,你应该为自己的字符串设置角色,因为你的要求和/或环境非常特殊,不管函数签名如何,非常见的标准库实现都是合适的。