map:映射
//注
std::map <key,value> c;
c[key];
返回一个引用,指向键值为key的元素,但如果元素不存在,就安插该元素
对于这一点,应该注意,不过有应该注意的地方,就是可能出错的地方,这就代表需要改进。但是这样设计,有利有弊。
1:可以直接使用下标索引来直接插入元素
2:如果不小心输错键值,且键值不存在在map里面,就会直接插入一个新的元素,而不会报错
//错误的想法
typedef std::map<std::string,float> StringFloatMap;
StringFloatMap coll;
StringFloatMap::iterator pos;
//……
for(pos=coll.begin(); pos!=coll.end(); pos++)
{
if(pos->second==value)
{
coll.erase(pos);//error!!!
}
}
//对pos 实施erase(),之后会使得pos不再是一个有效的iterator
// 正确做法应该是:
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值
//例如这样的代码
map<key,value> ::iterator pos;
pos->second//可以获得元素的实值
//尝试使用
//pos->first=key_;
//会出现错误
如果非要修改key的值,唯一的方法,就是使用value相同旧元素替换为元素
template <class cont>
bool replace_key( cont& c,
const typename cont::key_type& old_key,
const typename cont::key_type& new_key )
{
typename cont::iterator pos;//需要加上type来体现cont是模板
pos=c.find(old_key);
//有key_type value_type 两个容器提供的类型,可以用来代表键与实值
if (pos!=c.end() )
{
c.insert( typename cont::value(new_key,pos->second));
c.remove(pos);
return true;
}
else
{
return false;
}
}