提问人:Imtiaz Mehedi 提问时间:1/24/2020 更新时间:1/25/2020 访问量:3436
为什么 c++ 映射值不更新相同的键?
Why c++ map value don't update for same key?
问:
这是我的代码:
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”应在此处打印。这里出了什么问题?
答:
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::pair
v
评论
m[{1,2}]="izm";