map内部以RB-tree( 一种平衡二叉树)结构存储。应用时可以通过迭代器方便操作。但在移除元素时容易出现问题。
- typedef std::map< std::string, float > myMap;
- myMap example;
- myMap::iterator pos;
- ......
- for( pos = example.begin(); pos != example.end(); ++pos )
- if( pos->second == value )
- {
- example.erase( pos );//运行时错误.
- }
对pos所指元素调用erase(), 会使pos不再是一个有效迭代器, 此后如果不对pos重新设置就使用pos,会导致未定义行为,比如++pos操作。
正确使用:
- for( pos = example.begin(); pos != example.end(); )
- if( pos->second == value )
- example.erase( pos++);
- else
- ++pos;
此时,pos++会将pos指向下一个元素,并返回其原始值。
当调用erase()时,pos已经不再指向那个即将被删除的元素了。