索引重载运算符和std :: map的插入方法调用之间有什么区别?
即:
some_map["x"] = 500;
VS
some_map.insert(pair<std::string, int>("x", 500));
答案 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中,那么它将插入它。