请问,为什么等号右边的stl::map 的[]操作会让元素增加???!! map<int,int> m; //这时候m.size()==0int i=m[12]; // 为什么这个时候 m.size()==1,语义不对啊。右边的[]应该仅仅实现查找取值功能啊。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 好。 _Tref operator[](const key_type& _Kv) {iterator _P = insert(value_type(_Kv, _Ty())).first; return ((*_P).second); }你看一下vc stl源代码,他是先Insert,然后再返回第二值的引用的。所以,不管是 i=m[4] 还是 m[4]=4;都会引起insert操作。但是,这个实现跟数组实在是太不同了,太另外费解了。 按理说 []在等号右边就应该仅仅是查询操作,而不应该存在insert操作。现在的实现,如果进行很多不存在的查找,就会产生很多不必要的元素吧。比如我在一个map查找 map[1]到 map[10000],就会在Map里产生10000个元素。如果说数字太无聊,那么我按照指针索引的,指针可就很多地址了。4G空间都有可能存在于map中了。如果使用者没有注意到这个的地方,就太可怕了。不知道我以前使用map是否产生这个问题了。 经过查找资料,我发现没办法区下标访问操作到底是左值还是右值。除非任何情况都不插入对象,。,所以使用map的时候,或者说使用任意一个重载了[]操作符的类时,在用下标访问成员之前,一定要判断是否包括key,如果包括,再进行赋值或取值。看来还是c#比较牛,它get和set是分开的。 要先find再使用,如int nRet;if(m.find(12) != m.end()){ nRet = m[12];}else{...} template<class TMap>BOOL MapFind(TMap& targetMap,TMap::key_type something,TMap::referent_type* pValue=NULL){ BOOL bRet=FALSE; TMap::iterator iter=targetMap.find(something); if(iter!=targetMap.end()) { bRet=TRUE; if(pValue) { *pValue=(*iter).second; } } return bRet;}我写了上面一个函数,来进行判断key是否存在,或者提取value.本来想继承一个map加上这个方法的,可是觉得继承的话,可能会在构造函数上有些麻烦。有人有合适的map继承方案吗。 哪位高手会用 WinIo 模拟一下键盘按A键啊。 如何将自定义类派生于CList 关于控件界面不刷新 怎么利用系统字体 MFC中如何改变滚动条的颜色?MFC如何改变分割条的颜色? InternetReadFile的问题(能解决的多加分) Linking...,...????编译出错,求助原因! 系统分析员报考者的呼声和心理感受写真----------- 致中软考指导委员会与出题组 VC 调用网页javascript 函数的方法 在OCX控件中怎样使用OCX控件?(加急) 各位是用系统提供的线程池还是自己写??? 不知道现在写个BT下载工具是否还有市场
{iterator _P = insert(value_type(_Kv, _Ty())).first;
return ((*_P).second); }你看一下vc stl源代码,他是先Insert,然后再返回第二值的引用的。所以,不管是 i=m[4] 还是 m[4]=4;都会引起insert操作。但是,这个实现跟数组实在是太不同了,太另外费解了。
现在的实现,如果进行很多不存在的查找,就会产生很多不必要的元素吧。比如我在一个map查找 map[1]到 map[10000],就会在Map里产生10000个元素。如果说数字太无聊,那么我按照指针索引的,指针可就很多地址了。4G空间都有可能存在于map中了。如果使用者没有注意到这个的地方,就太可怕了。不知道我以前使用map是否产生这个问题了。
int nRet;
if(m.find(12) != m.end())
{
nRet = m[12];
}
else
{
...
}
BOOL MapFind(TMap& targetMap,TMap::key_type something,TMap::referent_type* pValue=NULL)
{
BOOL bRet=FALSE;
TMap::iterator iter=targetMap.find(something);
if(iter!=targetMap.end())
{
bRet=TRUE;
if(pValue)
{
*pValue=(*iter).second;
}
}
return bRet;
}
我写了上面一个函数,来进行判断key是否存在,或者提取value.本来想继承一个map加上这个方法的,可是觉得继承的话,可能会在构造函数上有些麻烦。有人有合适的map继承方案吗。