effective STL-02 小心对"容器无关代码"的幻想
大约 2 分钟
effective STL-02 小心对"容器无关代码"的幻想
STL是建立在泛化的基础上的。
- 数组泛化为容器,参数泛化所包含对象的类型。
- 函数泛化为算法,参数泛化所用的迭代器类型。
- 指针泛化为迭代器,参数泛化所指向的对象的类型。
不同容器是不同的,优点和缺点大不相同,不要去对它们做包装
- 序列容器支持push_front、push_back,但关联容器不支持
- 关联容器提供logN复杂度的lower_bound、upper_bound和equal_range,(N叉树)
- 不同的容器是不同的,优缺点有重大不同。它们不被设计成可互换的,而且你做不了什么包装的工作
尽量用typedef来代替冗长的container<class>
以及container<class>::iterator
代码,使用typedef的好处还有,换另一种容器方便(以及更换allocator等其他template参数的时候)
class Widget { ... };
typedef vector<Widget> WidgetContainer; //只修改一处
typedef WidgetContainer::iterator WCIterator; //只修改一处
//using WCIterator =WidgetContainer::iterator C++11
WidgetContainer cw;
Widget bestWidget;
...
WCIterator i = find(cw.begin(), cw.end(), bestWidget);
如果问题的改变是简单的加上用户的allocator时特别方便
class Widget { ... };
template<typename T> // 关于为什么这里需要一个template
SpecialAllocator { ... }; // 请参见条款10
typedef vector<Widget, SpecialAllocator<Widget> > WidgetContainer;
typedef WidgetContainer::iterator WCIterator;
WidgetContainer cw; // 仍然能用
Widget bestWidget;
...
WCIterator i = find(cw.begin(), cw.end(), bestWidget); // 仍然能用
2.如果不想对用户暴露所使用容器的类型,则把容器进行封装,把容器类型定义在private域,只提供相应的接口给用户
class CustomerList {
private:
typedef list<Customer> CustomerContainer;
typedef CustomerContainer::iterator CCIterator;
CustomerContainer customers;//隐藏
public: // 通过这个接口
... // 限制list特殊信息的可见性
};
参考文章:
https://www.cnblogs.com/yan1345/p/Note_of_Effective_STL.html#02-小心对容器无关代码的幻想
Loading...