C++ STD集合中引用的生存期

C++ STD集合中引用的生存期,c++,c++11,map,std,C++,C++11,Map,Std,对STD集合(如映射)返回的元素的引用有效多长时间 例如,在此代码中: struct Employee{ int salary; string name; // the key }; map<string,Employee> allemployees; ... Employee & Joe = allemployees["Joe Smith"]; Joe.salary=150; // change "Joe Smith"'s salary assert

对STD集合(如映射)返回的元素的引用有效多长时间

例如,在此代码中:

struct Employee{
   int salary;
   string name; // the key
     };

map<string,Employee> allemployees;
...
Employee & Joe = allemployees["Joe Smith"];
Joe.salary=150; // change "Joe Smith"'s salary
assert(allemployees["Joe Smith"].salary==150); //always true
 ....
allemployees["Mark Jones"]= Employee();
... // No "Joe Smith" operations in the dots
 Joe.salary=200;
 assert (allemployees["Joe Smith"].salary==200); //true or not?
struct Employee{
国际工资;
字符串名称;//密钥
};
员工地图;
...
员工&乔=所有员工[“乔·史密斯”];
乔:工资=150;//更改“乔·史密斯”的工资
断言(所有员工[“乔·史密斯”]。工资==150)//永远正确
....
所有员工[“马克·琼斯”]=员工();
... // 没有“乔·史密斯”行动
乔:工资=200;
断言(所有员工[“乔·史密斯”]。工资==200)//是不是?
}

换句话说,我从一个映射中得到一个值引用。然后,我对底层映射执行各种其他插入、删除等操作。原始参考值是否仍然良好?其他收藏品呢

还有,我怎么知道?我抬头看了看,但什么也没看到

来自C语言背景的我对引用和集合及其交互感到困惑。我是否应该考虑自己的价值观的地图?那意味着什么

那么一个更一般的问题是:我在哪里可以找到这个问题和类似问题的规范性答案


[这是已删除问题的修订版]

std::map
引用因与使迭代器无效相同的操作而无效-这在标准和cppreference.com等地方有很好的记录

总之,对于
std::map
,只要您不
清除
map
,或
删除
特定引用元素,引用就有效;插入或删除其他元素是可以的。例如,表示“没有迭代器或引用无效”

您会发现有关于其他容器及其操作的声明。。。。
(jrok在注释中指出,push to
deque
是引用保持有效但迭代器无效的操作示例)。

OK谢谢。使用值类型为引用的映射的语义如何,例如map。例如,我能保证映射所做的任何事情都不会影响它指向的底层员工吗?@kdog:你不能拥有“值类型为引用的映射”。。。不允许。例如,参见C++11规范明确规定(§23.2.1[容器.要求.一般]/1):容器是存储其他对象的对象。在某些情况下,迭代器无效,但引用无效,例如推到
deque
。谢谢,我感谢您的回答和指针(或引用)对于其他信息源也是如此。STD大写时是一个令人困惑的首字母缩略词
;-)@rubenvb-是的。。。“STD收藏中的终生记忆”