加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:04:44 所属栏目:百科 来源:网络整理
导读:我目前正在查看STL库,我想知道为什么对于矢量类向量 string名称;我必须调用remove();如下: names.erase(remove(names.begin(),names.end(),"Simon"),names.end()); 使用列表类列表时 string名称;我可以调用函数如下: remove("Simon"); 我也注意到reverse()
我目前正在查看STL库,我想知道为什么对于矢量类向量< string>名称;我必须调用remove();如下:

names.erase(remove(names.begin(),names.end(),"Simon"),names.end());

使用列表类列表时< string>名称;我可以调用函数如下:

remove("Simon");

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

reverse(names.begin(),names.end());

而对于列表< string>名称;它被称为如下:

names.reverse();

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

解决方法

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

通常,在< algorithm>中声明的自由函数std :: remove,std :: remove_if和std :: reverse. header将通过复制和移动元素对矢量,列表,deques和数组起作用. (当然,它们不会在集合或映射上工作,因为对于那些你不能随意重新排列元素的人.)请注意,std :: remove不会从容器中删除元素.

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

有特殊情况:

> std :: list提供反向,作为成员,因为只有成员函数可以保证它不会使任何迭代器无效;通用的std :: reverse不能.
>删除和remove_if也是如此,虽然这些名称具有误导性,因为与自由函数不同,成员会从列表中删除元素.
>还有std :: list的成员排序,因为通用std :: sort仅适用于随机访问迭代器.
>对于集合和映射,我们应该使用它们的成员lower_bound,upper_bound,equal_range和count而不是泛型版本,因为它们知道如何沿树向下走并以对数时间获得结果,而自由函数将使用线性时间.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读