map<int,int> m; //这时候m.size()==0int i=m[12]; // 为什么这个时候 m.size()==1,语义不对啊。右边的[]应该仅仅实现查找取值功能啊。

解决方案 »

  1.   

    好。 _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操作。但是,这个实现跟数组实在是太不同了,太另外费解了。
      

  2.   

    按理说 []在等号右边就应该仅仅是查询操作,而不应该存在insert操作。
    现在的实现,如果进行很多不存在的查找,就会产生很多不必要的元素吧。比如我在一个map查找 map[1]到 map[10000],就会在Map里产生10000个元素。如果说数字太无聊,那么我按照指针索引的,指针可就很多地址了。4G空间都有可能存在于map中了。如果使用者没有注意到这个的地方,就太可怕了。不知道我以前使用map是否产生这个问题了。
      

  3.   

    经过查找资料,我发现没办法区下标访问操作到底是左值还是右值。除非任何情况都不插入对象,。,所以使用map的时候,或者说使用任意一个重载了[]操作符的类时,在用下标访问成员之前,一定要判断是否包括key,如果包括,再进行赋值或取值。看来还是c#比较牛,它get和set是分开的。
      

  4.   

    要先find再使用,如
    int nRet;
    if(m.find(12) != m.end())
    {
       nRet = m[12];
    }
    else
    {
    ...
    }
      

  5.   

    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继承方案吗。