首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

multimap 怎么修改键值?

2012-02-14 
multimap 如何修改键值??C/C++ code#pragma warning(disable: 4786)#pragma warning(disable: 4096)#inclu

multimap 如何修改键值??

C/C++ code
#pragma warning(disable: 4786)#pragma warning(disable: 4096)#include <math.h>#include <map>#include <algorithm>#include <iostream>#include <string>   using namespace std;#include "afxmt.h"typedef struct CompanyStruct{    CString CompanyCode;    CString CompanyName;} Company;#include "afxmt.h"typedef multimap <CString, Company> mmss1;typedef multimap <CString, Company>::const_iterator CIT1; typedef multimap <CString, Company>::iterator IT1; typedef pair<CIT1, CIT1> Range1;typedef multimap<CString, Company> CompanyMap;typedef CompanyMap::iterator iterAB;void main(){        multimap<CString, Company> st1;    Company ak47;    ak47.CompanyCode = "CHINA";    ak47.CompanyName = "AK47";    CString s1 = "ok";    st1.insert(make_pair(s1, ak47));    ak47.CompanyCode = "usa";    st1.insert(make_pair(s1, ak47));    ak47.CompanyCode = "uk";    st1.insert(make_pair(st1, ak47));    Range1 range1 = st1.equal_range("OK");    Company c;    for(CIT1 cit1 = range1.first; cit1 != range1.second; ++cit1)    {        if(cit1->second.CompanyCode == "CHINA")        {                        // 这里想修改键值,不行啊             multimap <CString, Company>::iterator it = const_cast<CIT1>(cit1);             it->second = ak47;             (cit1)->second = ak47;            return;        }    }}


提示错误:
--------------------Configuration: EX32 - Win32 Debug--------------------
Compiling...
main.cpp
D:\FUSH\EXERCISE\EX32\main.cpp(55) : error C2440: 'const_cast' : cannot convert from 'class std::_Tree<class CString,struct std::pair<class CString const ,struct CompanyStruct>,struct std::multimap<class CString,struct CompanyStruct,struct std::less
<class CString>,class std::allocator<struct CompanyStruct> >::_Kfn,struct std::less<class CString>,class std::allocator<struct CompanyStruct> >::const_iterator' to 'class std::_Tree<class CString,struct std::pair<class CString const ,struct CompanyS
truct>,struct std::multimap<class CString,struct CompanyStruct,struct std::less<class CString>,class std::allocator<struct CompanyStruct> >::_Kfn,struct std::less<class CString>,class std::allocator<struct CompanyStruct> >::const_iterator'
  Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast
D:\FUSH\EXERCISE\EX32\main.cpp(57) : error C2678: binary '=' : no operator defined which takes a left-hand operand of type 'const struct CompanyStruct' (or there is no acceptable conversion)
Error executing cl.exe.

EX32.exe - 2 error(s), 0 warning(s)


[解决办法]
map,multimap都是关联容器,不能手动修改其中key值,否则将破坏整个容器。楼主再好好看看相关方面的书吧
[解决办法]
for(CIT1 cit1 = range1.first; cit1 != range1.second; ++cit1)
{
if(cit1->second.CompanyCode == "CHINA")
{
// 这里想修改键值,不行啊
multimap <CString, Company>::iterator it = const_cast<CIT1>(cit1);
it->second = ak47; 
(cit1)->second = ak47;
return;
}
}

你的迭代器是const_iterator,怎么可以修改value呢?你要修改,要使用iterator,而不是const_iterator
[解决办法]
const_itretor是不能通过const_cast转换为iterator的,要么使用iterator,要么通过advance和distance来转换(Effective STL item 27)
------解决方案--------------------


楼主像这样修改迭代器的属性:(偷的代码,呵呵)

C/C++ code
typedef deque<int> IntDeque;              typedef IntDeque::iterator Iter;typedef IntDeque::const_iterator ConstIter;IntDeque  d;ConstIter ci; //一个const_iteratorIter i(d.begin());                          // 初始化i为d.begin()advance(i, distance<ConstIter>(i, ci)); 

热点排行