Effective STL 中文版记录(八)

Effective STL 章节(八)

——50条有效使用STL的经验(50/50)
完结--在程序中使用STL



第四十三条、算法调用优先于手写的循环

理由是:

效率更高
比起自己写,用算法更不易出错
可维护性更高,代码易读性强

因为有些元素是我们用户不能用的,比如指针,虽然有迭代器,但是毕竟不是指针,所以用算法吧

第四十四条、容器的成员函数优先于同名的算法

这与第二条:不要试图编写独立于容器类型的代码 的思路一样

容器自己是最懂自己的,特化的函数比起通用性的函数总会在效率上更好

第四十五条、正确区分count、find、binary_search、lower_bound、upper_bound和equal_range

这里通过一个表格可以结束

在这里插入图片描述

第四十六条、考虑使用函数对象而不是函数作为STL算法的参数

分清楚使用函数对象做参数和使用函数做参数,在代码上面长什么样:

使用函数作为参数:

bool compare(int a, int b) {
    return a < b;
}

std::vector<int> v = {4, 2, 3, 1};
std::sort(v.begin(), v.end(), compare);

使用函数对象作为参数:

struct Compare {
    bool operator()(int a, int b) const {
        return a < b;
    }
};

std::vector<int> v = {4, 2, 3, 1};
std::sort(v.begin(), v.end(), Compare());

后者实际上是以类的形式代替了函数,直觉上会更慢,因为要创建对象之类的

然而事实上,后者会在效率上更快,因为函数作为参数时,传入算法的是函数指针

而函数指针会抑制内联机制,反观函数对象则不会,所以考虑效率来讲,用函数对象更好一些

第四十七条、避免产生“直写型”(write-only)的代码

这一条的存在是为了提醒代码规范问题,如:

v.erase(
	remove_if(find_if(v.rbegin(), v.rend(),
						bind2nd(greater_equal<int>(), y)).base(),
		v.end(),
		bind2nd(less<int>(), x)),
	v.end());

这样一行代码下来,想看懂是非常困难的

完全可以拆开,这样阅读和维护都更简单一点,没有必要为了困难而困难

第四十八条、总是包含(#include)正确的头文件

因为不同的C++平台中STL库的实现有可能不同

当A平台中允许

#include<iostrem>

std::vector<int> v;

即便不对vector头文件进行包含也能用,但是如果移植到B平台中可能就不允许了

所以不管平台是否允许,当调用一个STL库时,一定记得包含它对应的头文件,减轻代码移植的压力

第四十九条、学会分析与STL相关的编译器诊断信息

建议每次出错后立马必应和stackoverflow搜一搜,这个只能堆经验

或者也可以GPT,虽然它也没法识别出段错误这种潜在问题出现在哪里

第五十条、熟悉STL相关的Web站点

SGI STL站点:http://www.sgi.com/tech/stl/
STL port站点:http://www.stlport.org
Boost站点:http://www.boost.org


总结

STL库中每个容器的选取与使用都需要根据功能需求进行选择,并且永远记住容器独有的算法一定优于通用的算法,这是STL库作者疯狂优化后的结果,使用它们也是对作者们的尊重

然而这五十条建议随着时间发展也有些过时,而且大部分是深度使用后才能理解的感受,所以对于C++ beginner来讲还是有些早了,在学习的过程中也有很多点是我完全没思考过的,也许这就是“实践是检验真理的唯一标准”。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值