为什么不同类的STL算法调用不同?

时间:2016-12-05 22:37:15

标签: c++ list vector stl

我目前正在查看STL库,我想知道为什么对于矢量类vector<string> names;我必须按如下方式调用remove();

names.erase(remove(names.begin(), names.end(), "Simon"), names.end());

使用列表类list<string> names;时,我可以按如下方式调用函数:

remove("Simon");

对于reverse(); vector<string> names;,我也注意到它的相同内容如下:

reverse(names.begin(), names.end());

对于list<string> names;,它的调用方式如下:

names.reverse();

总是调用矢量的方式更合适吗?为什么是这样?我对C ++很陌生,所以我很想知道最好的做事方式。

1 个答案:

答案 0 :(得分:7)

基本上,有一些特殊情况与特定容器的性质有关。

一般 <html> <head> <link rel=import href='hello-world.html'> <body> <hello-world></hello-world> 标题中声明的免费函数std::removestd::remove_ifstd::reverse将适用于向量,列表,deques ,以及通过复制和移动元素的数组。 (当然,他们不会在集合或地图上工作,因为对于那些你不能随意重新排列元素的人。)注意<algorithm>不会从容器中删除元素。

通常每个容器类型的成员函数std::remove用于从该容器中删除元素。 (请注意,erase没有std::array,因为它的大小是固定的。)

特殊情况:

  • erase提供std::list,作为成员,因为只有成员函数才能保证它不会使任何迭代器无效;通用reverse不能。
  • 同样适用于std::reverseremove,但这些名称具有误导性,因为与免费功能不同,成员执行从列表中删除元素。
  • remove_if还有一个成员sort,因为通用std::list仅适用于随机访问迭代器。
  • 对于集合和地图,我们应该使用其成员std::sortlower_boundupper_boundequal_range而不是通用版本,因为他们知道如何走下去树,并以对数时间得到结果,而自由函数将使用线性时间。

通常,原则似乎是:标准库容器尽可能支持统一接口,但也提供其他专用功能,以便提供依赖于其内部的功能。