为什么 c++ 映射值不更新相同的键?

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

提问人:Imtiaz Mehedi 提问时间:1/24/2020 更新时间:1/25/2020 访问量:3436

问:

这是我的代码:

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”应在此处打印。这里出了什么问题?

C++ STL

评论

1赞 drescherjm 1/24/2020
这就是插入的行为。https://en.cppreference.com/w/cpp/container/map/insert 如果容器尚未包含具有等效键的元素,则将元素插入容器中。
0赞 Imtiaz Mehedi 1/24/2020
插入应该使用什么功能?
1赞 Daniel Langr 1/24/2020
@ImtiazMehedi 只需使用 .m[{1,2}]="izm";
0赞 drescherjm 1/24/2020
使用 insert 代替 insert。operator[] 进行更新
2赞 Slava 1/24/2020
“我们知道,如果我们在地图中插入一个现有键的值,它将更新该值。” 我们知道错了,不幸的是:(我们应该根据明确说明的文档来了解我们的知识。

答:

5赞 juanchopanza 1/24/2020 #1

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

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

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

评论

2赞 Caleth 1/24/2020
您还可以使用operator[]
1赞 juanchopanza 1/24/2020
@Caleth 是的,有点。创建一个值初始化的值,然后为其分配一个值。但我编辑了答案以反映这一点。
12赞 ypnos 1/24/2020 #2

这是不覆盖地图中现有条目的预期行为。insert

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

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

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

1赞 Sujith Gunawardhane 1/24/2020 #3

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

1赞 TonySalimi 1/25/2020 #4

(您使用的那个)的签名是这样的:std::map::insert

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

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