//移除迭代器所指元素的正确做法
typedef std::map<std::string,float> StringFloatMap;
StringFloatMap coll;
StringFloatMap::iterator pos;
for(pos = coll.begin(); pos != coll.end(); )
{
if(pos->second == value)
coll.erase(pos++);
else
++pos;
}
//插入key/value时的3种方法
//方法1
std::map<std::string,float> coll;
coll.insert(std::map<std::string,float>::value_type("otto",22.3));
//方法2
std::map<std::string,float> coll;
//use implict conversition
coll.insert(std::pair<std::string,float>::value_type("otto",22.3));
//use no implict conversition
coll.insert(std::pair<const std::string,float>::value_type("otto",22.3));
//方法3
std::map<std::string,float> coll;
coll.insert(std::make_pair("otto",22.3));
通常,关联式容器并不提供元素的 直接存取,你必须依靠迭代器。不过map是个例外。Non-const map提供下标操作符,支持元素直接存取。
下标操作符的索引值并非元素整数位置,而是元素的key。
如果你使用某个key作为索引,而窗口之中尚未存在对应元素,那么就会自动安插该元素。新元素的value由default构造函数构造。如果元素的value型别没有提供default构造函数,就不能使用。所有基本数据型别都提供有default构造函数,以0值为初值。、
优点:
std::map<std::string,float> coll;
coll["otto"] = 7.7;
其中的语句coll["otto"] = 7.7;处理如下:
1,处理coll["otto"]
- 如果存在键值为"otto"的元素,以上式子返回该元素的reference
- 如果没有任何元素的键值是"otto",以上式子便为map自动安插一个新元素,键值为"otto",实值value则以default构造函数完成,并返回一个reference引用。
2,将7.7赋值给value
- 紧接着,将7.7赋值给上述刚刚诞生的新元素。
缺点:
可能不小心误置新元素。例如:cout<<coll["ottto"];它会安插一个键值为"ottto"的新元素,然后打印实值 。
同时这种元素安插方式比 一般的map安插方式来得慢, 原因是新元素必须先使用 default构造函数将实值初始化,而这个初值马上又被真正的value给覆盖了。