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));