为什么 c++ 映射值不针对同一键更新?

Why c++ map value don't update for same key?

本文关键字:一键 更新 c++ 映射 为什么      更新时间:2023-10-16

这是我的代码:

map <pair<int,int> ,string> m; 
m.insert(make_pair(1,2),"imtiaz");//making key value pair
m.insert(make_pair(8,3),"moin");
m.insert(make_pair(1,2),"izm");
cout<<m[make_pari(1,2)]<<endl; //print value for key 1,2
output:
imtiaz

我们知道如果我们在 map 中插入现有键的值,它将更新该值。在这里,对于相同的键 (1,2(,我插入两个值"imtiaz"和"izm"。因此,最新值"izm"应在此处打印。这里有什么问题?

insert的预期行为是不覆盖映射中的现有条目。

对预期行为使用insert_or_assign(C++17(。在较旧的C++版本中,将赋值与operator[]一起使用来更新(或插入(元素。

那么为什么引入insert_or_assign呢?从上面的链接:

insert_or_assign返回比 operator[] 更多的信息,并且不需要映射类型的默认可构造性。

std::map::insert不会修改映射中已有的元素。相反,它插入新元素。返回类型允许检查插入是否成功(即还没有具有相同键的元素(。

您可以使用operator[]添加新元素修改现有元素:

m[make_pair(1,2)] = "izm";

std::map::insert 不会更新现有元素。 您可以使用insert_or_assign或运算符 []。

std::map::insert

(您使用的那个(的签名如下所示:

template< class T >
std::pair<iterator, bool> insert(T&& v); 

正如您在签名中看到的,返回值是一个std::pair,该对的第二个元素是布尔值,显示v是否已插入到 map 中。