我目前正在查看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 ++很陌生,所以我很想知道最好的做事方式。
答案 0 :(得分:7)
基本上,有一些特殊情况与特定容器的性质有关。
一般 <html>
<head>
<link rel=import href='hello-world.html'>
<body>
<hello-world></hello-world>
标题中声明的免费函数std::remove
,std::remove_if
和std::reverse
将适用于向量,列表,deques ,以及通过复制和移动元素的数组。 (当然,他们不会在集合或地图上工作,因为对于那些你不能随意重新排列元素的人。)注意<algorithm>
不会从容器中删除元素。
通常每个容器类型的成员函数std::remove
用于从该容器中删除元素。 (请注意,erase
没有std::array
,因为它的大小是固定的。)
有特殊情况:
erase
提供std::list
,作为成员,因为只有成员函数才能保证它不会使任何迭代器无效;通用reverse
不能。std::reverse
和remove
,但这些名称具有误导性,因为与免费功能不同,成员执行从列表中删除元素。remove_if
还有一个成员sort
,因为通用std::list
仅适用于随机访问迭代器。std::sort
,lower_bound
,upper_bound
和equal_range
而不是通用版本,因为他们知道如何走下去树,并以对数时间得到结果,而自由函数将使用线性时间。通常,原则似乎是:标准库容器尽可能支持统一接口,但也提供其他专用功能,以便提供依赖于其内部的功能。