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

stu*_*194 3 c++ stl list vector

我目前正在查看STL库,我想知道为什么vector<string> names;我必须调用一个向量类remove();,如下所示:

names.erase(remove(names.begin(), names.end(), "Simon"), names.end());
Run Code Online (Sandbox Code Playgroud)

在使用列表类时,list<string> names;我可以调用该函数,如下所示:

remove("Simon");
Run Code Online (Sandbox Code Playgroud)

我也注意到同样为reverse();vector<string> names;它被称为如下:

reverse(names.begin(), names.end());
Run Code Online (Sandbox Code Playgroud)

虽然list<string> names;它被称为如下:

names.reverse();
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 7

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

一般来说自由功能std::remove,std::remove_ifstd::reverse在声明的<algorithm>头部将通过复制和移动元件上的载体,列表,双端队列,和数组.(当然,它们不会在集合或映射上工作,因为对于那些你不能随意重新排列元素的人.)注意,std::remove不会从容器中删除元素.

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

特殊情况:

  • std::list提供reverse,作为成员,因为只有成员函数可以保证它不会使任何迭代器无效; 通用std::reverse不能.
  • 这同样适用remove,remove_if虽然这些名称具有误导性,因为与自由函数不同,成员从列表中删除元素.
  • 还有一个成员sortstd::list,因为一般std::sort仅适用于随机访问迭代器.
  • 对于套和地图,我们应该用自己的成员lower_bound,upper_bound,equal_range和,count而不是通用版本,因为他们知道如何走在树,得到的结果是对数时间,而免费的功能将使用线性时间.

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