第一章 容器

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容器之间的差异太大,试图编写完全通用的容器无关代码会导致代码复杂、效率低下且容易出错。更好的做法是接受容器类型的限制,通过良好的封装设计来最小化更换容器时对代码的影响。