- 论坛徽章:
- 0
|
既然有了要一次次的改变容器类型的必然性,你可以用这个常用的方法让改变得以简化:使用封装,封装,
再封装。其中一种最简单的方法是通过自由地对容器和迭代器类型使用typedef。因此,不要这么写:
class Widget {...};
vector<Widget> vw;
Widget bestWidget;
... // 给bestWidget一个值
vector<Widget>::iterator i = // 寻找和bestWidget相等的Widget
find(vw.begin(), vw.end(), bestWidget);
要这么写:
class Widget { ... };
typedef vector<Widget> WidgetContainer;
typedef WidgetContainer::iterator WCIterator;
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); // 仍然能用
如果typedef带来的代码封装作用对你来说没有任何意义的话,你仍然会称赞它们可以节省许多工作。比如,
你有一个如下类型的对象 |
|