std :: map索引和插入调用之间的区别

时间:2009-10-20 13:32:35

标签: c++ stl map hashmap

索引重载运算符和std :: map的插入方法调用之间有什么区别?

即:

some_map["x"] = 500;

VS

some_map.insert(pair<std::string, int>("x", 500));

4 个答案:

答案 0 :(得分:22)

我相信insert()不会覆盖现有值,并且可以通过测试返回的迭代器/对值中的bool值来检查操作的结果

对下标运算符[]的赋值只会覆盖那里的任何内容(如果没有那个就插入一个条目)

如果你不期望这种行为并且不适应它,那么insert和[]运算符都会引起问题。

例如使用insert:

std::map< int, std::string* > intMap;
std::string* s1 = new std::string;
std::string* s2 = new std::string;
intMap.insert( std::make_pair( 100, s1 ) ); // inserted
intMap.insert( std::make_pair( 100, s2 ) ); // fails, s2 not in map, could leak if not tidied up

和[]运算符:

std::map< int, std::string* > intMap;
std::string* s1 = new std::string;
std::string* s2 = new std::string;
intMap[ 100 ] = s1; // inserted
intMap[ 100 ] = s2; // inserted, s1 now dropped from map, could leak if not tidied up

我认为这些是正确的,但没有编译它们,因此可能有语法错误

答案 1 :(得分:8)

对于map,前一个(operator[])表达式将始终用新提供的值替换键值对的值部分。如果尚未存在,则将插入新的键值对。

相反,insert只会在地图中不存在与提供的关键部分的键值对时插入新的键值对。

答案 2 :(得分:5)

除了map::operator[]将替换现有值的事实是operator[] map ::将创建并添加到地图之前要替换的默认现有值发生替换(map::operator[]()调用必须返回对某事的引用)。对于创建成本昂贵的项目,这可能是性能问题。

请参阅“{24}:map::operator[]map::insert之间在效率很重要时谨慎选择”Scott Meyers' Effective STL

答案 3 :(得分:0)

insert方法插入到map中,而重载索引操作符将返回带有key_value键的元素(如果它在map中),如果它不在map中,那么它将插入它。