天天看点

27 使用distance和advance将容器的const_iterator转换成iterator

大多数情况下,将const_iterator强制转换成iterator不能通过编译,利用const_cast、reinterpret_cast、static_cast 甚至C语言的强制类型转换。 对于vector和string也许能通过编译,只针对const_iterator,而reinterpret_cast、static_cast仍然不行。 可以使用advance和distance将const_iterator 转换成 iterator: 伪代码:

typedef deque<int> IntDeque;
typedef IntDeque::iterator iter;
typedef IntDeque::const_iterator ConstIter;
IntDeque d;
ConstIter ci;
Iter i(d.begin());
advance(i,distance<ConstIter>(i,ci)); //distance用于取得两个迭代器的距离,advance移动到指定的距离
           

这种技术的效率取决于容器,对随机访问的迭代器(vector string deque)是常量时间操作。 对双向迭代器(其他标准容器,以及散列)是线性时间的操作。

继续阅读