怎么把const_iterator强制转化成iterator

      今天在使用STL中的mutilmap时遇到了一个比较郁闷的问题,STL的一些函数只能接受iterator作为参数,不能传const_iterator类型的参数,既不存在两种迭代器的隐式转换,使用const_cast也是不行的,编译怎么也通不过,看stl的源码const_iterator和iterator两个之间还真没啥血缘关系,在网上搜索了一下资料,然来STL也考虑了这一问题,使用了一个折衷的方法来解决这一问题,使用迭代器<iterator>里面的advance和distance这两个函数来完成这件事情,原理很简单,首先将iterator指向容器的开始位置,然后把它向前移到和const_iterator距离容器起始位置的偏移量一样的位置就可以了,代码如下:

 

// multimap multimap<int, string> mmapUrl; mmapUrl.insert(make_pair(1, string("www.baidu.com"))); mmapUrl.insert(make_pair(1, string("www.google.com"))); mmapUrl.insert(make_pair(1, string("www.soso.com"))); mmapUrl.insert(make_pair(2, string("www.sina.com"))); mmapUrl.insert(make_pair(2, string("www.qq.com"))); mmapUrl.insert(make_pair(2, string("www.sina.com"))); mmapUrl.insert(make_pair(3, string("www.csdn.com"))); typedef multimap<int, string>::const_iterator CIT; typedef multimap<int, string>::iterator IT; typedef pair<IT, IT> Range; typedef pair<CIT, CIT> CRange; CRange range1 = mmapUrl.equal_range(2); CIT i = range1.first; for(; i != range1.second; ++i) cout << i->second << endl; IT it(mmapUrl.begin()); // 初始化it为mmapUrl.begin() advance(it, distance<CIT>(it, i)); mmapUrl.erase(it); //mmapUrl.erase(i);// 这行代码是无法通过编译的

 

      注意distance这个模板函数,应该显示指定参数类型,否则可能不能通过编译,因为计算距离的时候,函数必须知道你的类型是什么才能正确计算距离。有时候编译器可以通过模板演绎推出参数类型,但这里不行,要显示指定。

      建议:尽量避免这种转换的发生,这不是一种漂亮的编程方法,虽然是被STL支持的。

 

你可能感兴趣的:(编程,String,iterator,编译器,pair,distance)