在map或unordered_map中是必需的insert()吗?

joh*_*ers 7 c++

我看到很多将项添加到a mapunordered_mapvia 的示例operator[],如下所示:

int main() {
    unordered_map <string, int> m;
    m["foo"] = 42;
    cout << m["foo"] << endl;
}
Run Code Online (Sandbox Code Playgroud)

是否有任何理由使用insert成员函数?看起来他们都做同样的事情.

Kir*_*rov 13

他们不是.

operator[]将覆盖此密钥的值(如果存在),而insert不会.

如果operator[]用于插入元素,预计会有点慢(请参阅下面@ MatthieuM的评论以获取详细信息),但这并不重要.

虽然std::map::insert回报std::pair< iterator, bool >,其中.second会告诉你,如果该值被插入或已存在.


关于你的评论:你不能拥有2个具有相同键和不同值的元素.这不是一个multimap.

如果地图中有一个元素,并且您尝试插入相同的键,则:

  • operator[] 将覆盖现有值
  • std::map::insert不会做任何事情.*返回a std::pair< iterator, bool >,其中.second将是false(说"未插入新元素,因为这样的键已存在")并且.first将指向找到的元素.

*由于来自@ luk32的注释/备注,我改变了这一点; 但通过写"不会做任何事",我并不是字面意思,我的意思是它不会改变现有元素的价值