02-不要试图编写独立于容器类型的代码
第一章 容器
02-不要试图编写独立于容器类型的代码
STL没有为所有容器提供统一的接口,试图编写适用于所有容器类型的通用代码是不现实的。
为什么无法编写真正的通用容器代码?
1.不同容器有不同的接口
vector和deque支持随机访问(operator[]),但list不支持;
list支持push_front/pop_front,但vector不支持;
vector和string提供reserve和capacity,但list没有;
只有vector和string支持与C数组兼容的数据布局( &v[0] )
2.不同容器的迭代器类型不同
vector提供随机访问迭代器;
list只提供双向迭代器;
某些算法要求特定类型的迭代器
推荐做法
1.使用typedef来简化类型声明
为特定容器类型创建别名,使代码更易读;
当需要更换容器时,只需修改 typedef 定义
2.使用类封装来隐藏容器实现
将容器隐藏在类的私有成员中;
通过类的公共接口限制对容器的操作;
这样更换容器类型时,只需修改类的内部实现,不影响客户端代码
3.根据具体需求选择最合适的容器
明确你的使用场景和需求;
参考第1条建议(慎重选择容器类型)来做出选择
总结
虽然C++模板提供了泛型编程的能力,但STL容器之间的差异太大,试图编写完全通用的容器无关代码会导致代码复杂、效率低下且容易出错。更好的做法是接受容器类型的限制,通过良好的封装设计来最小化更换容器时对代码的影响。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
