今天在使用STL中的mutilmap时遇到了一个比较郁闷的问题,STL的一些函数只能接受iterator作为参数,不能传const_iterator类型的参数,既不存在两种迭代器的隐式转换,使用const_cast也是不行的,编译怎么也通不过,看stl的源码const_iterator和iterator两个之间还真没啥血缘关系,在网上搜索了一下资料,然来STL也考虑了这一问题,使用了一个折衷的方法来解决这一问题,使用迭代器<iterator>里面的advance和distance这两个函数来完成这件事情,原理很简单,首先将iterator指向容器的开始位置,然后把它向前移到和const_iterator距离容器起始位置的偏移量一样的位置就可以了,代码如下:
IT it(mmapUrl.begin()); // 初始化it为mmapUrl.begin()
advance(it, distance<CIT>(it, i));
mmapUrl.erase(it);
//mmapUrl.erase(i);// 这行代码是无法通过编译的
注意distance这个模板函数,应该显示指定参数类型,否则可能不能通过编译,因为计算距离的时候,函数必须知道你的类型是什么才能正确计算距离。有时候编译器可以通过模板演绎推出参数类型,但这里不行,要显示指定。
建议:尽量避免这种转换的发生,这不是一种漂亮的编程方法,虽然是被STL支持的。