gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:10:13 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com