C&C++
发布时间:2022-04-03 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了STL算法和容器中的成员方法同名时,该如何选择?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
通过前面的学习,我们已经掌握了一些 STL 算法的
功能和
用法。值得一提的是,STL 标准库提供有 70 多种算法
函数,其中有些
函数名称和 STL 容器模板类中提供的成员
方法名相同。
例如,STL 标准库提供了 sort() 和 merge()
函数,而 list 容器模板类中也提供有同名的 sort() 和 merge() 成员
方法。再比如,STL 标准库提供有 count()、find()、lower_bound()、upper_bound() 以及 equal_range() 这些
函数,而每个关联式容器(除哈希容器外)也提供
有相同
名称的成员
方法。
那么,当某个 STL 容器提供有和算法同名的成员
方法时,应该使用哪
一个呢?大多数情况下,我们应该使用 STL 容器提供的成员
方法,而不是同名的 STL 算法,原因
包括:
@H_
801_4@
虽然同名,但它们的底层实现并不完全相同。相比同名的算法,容器的成员方法和自身结合地更加紧密。
相比同名的算法,STL 容器提供的成员方法往往执行效率更高;
举个例子:
#include <iostream> // std::cout
#include <algorithm> // std::find
#include <set> // std::set
#include <String> // std::string
using namespace std;
//为 set 容器自定义排序规则,即按照字符串长度进行排序
class mycomp {
public:
bool operator() (const String &i,const String &j) const {
return i.length() < j.length();
}
};
int main() {
//定义 set 容器,其排序规则为 mycomp
std::set<String,mycomp> myset{"123","1234","123456"};
//调用 set 容器成员方法
set<String>::iterator iter = myset.find(String("abcd"));
if (iter == myset.end()) {
cout << "查找失败" << endl;
}
else {
cout << *iter << endl;
}
//调用 find() 函数
auto iter2 = find(myset.begin(),myset.end(),String("abcd"));
if (iter2 == myset.end()) {
cout << "查找失败" << endl;
}
else {
cout << *iter << endl;
}
return 0;
}
程序执行结果为:
1234
查找失败
可以看到,程序中分别
调用了 find()
函数和 set 容器
自带的 find() 成员
方法,都用于查找 "abcd" 这个字符串,但查找结果却不相同。其中,find() 成员
方法成功找到了和 "abcd" 长度相同的 "1234",但 find()
函数却查找失败。
之所以会这样,
是因为 find() 成员
方法和 find()
函数底层的实现机制不同。前者会依照 mycomp() 规则查找和 "abcd" 匹配的元素,而 find()
函数底层仅会依据 "==" 运算符查找 myset 容器中和 "abcd" 相等的元素,所以会查找失败。
不仅如此,无论是序列式容器还是关联式容器,成员
方法的执行效率要高于同名的 STL 算法。仍以 find()
函数和 set 容器中的 find() 成员
方法为例。要知道,find()
函数是通过“逐个比对”来实现查找的,它以线性时间运行;而由于 set 容器底层存储结构采用的是红黑树,所以 find() 成员
方法以对数时间运行,而非线性时间。
换句话说,对于含有一百万个元素的 set 容器,如果使用 find() 成员
方法查找目标元素,其最差情况下的比对
次数也不会超过 40 次(平均只需要比对 20 次就可以查找成功);而使用同名的 find()
函数查找目标元素,最差情况下要比对一百万次(平均比对 50 万次才能查找成功)。
并且
需要注意的一点是,
虽然有些容器提供的成员
方法和某个 STL 算法同名,但该容器只能使用
自带的成员
方法,而不适用同名的 STL 算法。比如,sort()
函数根本不能应用到 list 容器上,因为该类型容器仅
支持双向迭代器,而 sort()
函数的参数类型要求为
随机访问迭代器;merge()
函数和 list 容器的 merge() 成员
方法之间也存在行为上的不同,即 merge()
函数是不允许
修改源数据的,而 list::merge() 成员
方法就是对源数据做
修改。
总之,当读者需要在 STL 算法与容器提供的同名成员
方法之间做选择的时候,应优先
考虑成员
方法。几乎可以肯定地讲,成员
方法的
性能更优越,也更贴合当前要操作的容器。
大佬总结
以上是大佬教程为你收集整理的STL算法和容器中的成员方法同名时,该如何选择?全部内容,希望文章能够帮你解决STL算法和容器中的成员方法同名时,该如何选择?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。