c++ - 为什么不同类别的 STL 算法调用不同?

标签 c++ list vector stl

我目前正在研究 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/

相关文章:

python - 获取长向量中最小值索引的有效方法,python

c++ - 用户定义的不同大小 vector 的减少

types - 如何比较 Rust 中拥有的向量和静态向量的内容?

c++ - OpenMPI:错误: ‘MPI’ 尚未声明

python - 将元组列表格式化并打印为一行

c++ - 如何判断 double float 是否可以安全地存储为单精度 float ?

python - 在python中以制表符分隔格式分割文本,将其添加到列表并将其写入文件......有更好的方法吗?

vector - Scheme中的多维向量?

c++ - 如何定义模板的模板化子类?

c++ - 内存访问冲突 C++ Borland