[7 使用STL] 44. 容器的成员函数优先于同名的算法

有些STL容器提供了一些与算法同名的成员函数。如,关联容器提供了count、find、lower_bound、upper_bound和equal_range,而list则提供了remove、remove_if、unique、sort、merge和reverse。大多数情况下,你应该使用这些成员函数,而不是相应的STL算法。理由有两点:

(1) 成员函数往往速度快

(2) 成员函数通常与容器结合得更紧密,这是算法所不能比的

1 关联容器

(1) 效率

假设有一个set<int>容器,其中包含了一百万个整数。现在你想知道727是否包含在其中,如果在的话,第一次出现727是在哪里。下面是两种不同的方法:

set<int> s;
...
set<int>::iterator i = s.find(727);
if (i != s.end()) ...
set<int>::iterator i = find(s.begin(), s.end(), 727);
if (i != s.end()) ...

set容器的find成员函数以对数时间运行(红黑树),find算法以线性时间运行,以下是两者的效率统计结果:

find成员函数:最坏40此,平均20次。

find算法:最坏1000000次,平均500000次。

(2) “相同性”测试

STL算法以相等性来判断两个对象是否具有相同的值,而关联容器则使用等价性来进行“相同性”测试。第19条find算法在一个关联容器中搜索失败,而使用find成员函数来搜索同样的值可以成功。

2 list

(1) 效率

remove、remove_if、unique、sort、merge以及reverse这些算法无一例外地需要复制list容器中的对象,而专门为list容器量身定做的成员函数则无需任何对象副本,它们只是简单地维护好那些list节点连接起来的指针。所以list的成员函数性能会更好。

(2)list成员函数的行为不同于与其同名的算法的行为

如32条所述,要从一个容器中删除对象的话,在调用了remove、remove_if或unique算法之后,必须紧接着调用erase;而list的remove、remove_if和unique成员函数则实实在在地删除了元素,无须再调用erase。

sort算法与list的sort函数:sort算法要求随机访问迭代器,不能别应用到list容器上,list的迭代器只是双向迭代器。

merge算法与list的merge函数:merge算法是不允许修改其源区间的,而list::merge则总是在修改它操作的链表。

总结:

成员函数的性能更为优越,且它们能够与容器的行为保持一致。

Supongo que te gusta

Origin blog.csdn.net/u012906122/article/details/120028567
Recomendado
Clasificación