C++ 为什么是c++;映射值don';不更新相同的密钥吗?

C++ 为什么是c++;映射值don';不更新相同的密钥吗?,c++,stl,C++,Stl,这是我的密码: 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 outp

这是我的密码:

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-m;
m、 插入(成对(1,2),“imtiaz”)//制作键值对
m、 插入(成对(8,3),“moin”);
m、 插入(成对(1,2),“izm”);
cout不会修改映射中已存在的元素。相反,它插入了新的元素。返回类型允许检查插入是否成功(即没有具有相同键的元素)

使用
操作符[]
添加新元素或修改现有元素:

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

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

使用(C++17)实现您期望的行为。在旧的C++版本中,使用赋值与<代码>运算符[]/COD>更新(或插入)元素。< /P> 那么为什么要引入
insert\u或\u assign
?从上面的链接:

insert_或_assign返回的信息比运算符[]多,并且不需要映射类型的默认可构造性


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

std::map::insert的签名(您使用的签名)如下所示:

template< class T >
std::pair<iterator, bool> insert(T&& v); 
模板
标准:成对插入(T&v);

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

这就是insert的行为。如果容器中尚未包含具有等效键的元素,则将元素插入容器。插入时应使用什么函数?@ImtiazMehedi只需使用
m[{1,2}]=“izm”。使用insert进行插入。运算符[]用于更新“我们知道,如果我们在映射中为现有键插入一个值,它将更新该值。”不幸的是,我们知道错误:(我们应该将我们的知识建立在文档的基础上,文档清楚地说明了这一点。)您也可以使用
运算符[]来“插入”元素
@Caleth是的,有点像。你创建一个初始化的值,然后给它赋值。但我编辑了答案以反映这一点。