我目前正在研究 STL 库,想知道为什么要使用 vector 类 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();
总是像 vector 那样调用更合适吗?为什么是这样?我是 C++ 的新手,所以我很想知道做事的最佳方式。
最佳答案
基本上,有一些特殊情况与特定容器的性质有关。
一般免费功能std::remove
, std::remove_if
, 和 std::reverse
在 <algorithm>
中声明header 将通过复制和移动元素来处理 vector 、列表、双端队列和数组。 (当然,它们不会在集合或 map 上工作,因为对于那些你不能随意重新排列元素。)请注意 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
, 和count
而不是通用版本,因为他们知道如何沿着树走下去并以对数时间获得结果,而自由函数将使用线性时间。
一般来说,原则似乎是:标准库容器尽可能支持统一接口(interface),但也提供额外的专门功能,以提供依赖于其内部结构的功能。
关于c++ - 为什么不同类别的 STL 算法调用不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40984634/