STD集合中引用的生命周期

时间:2014-05-12 02:59:02

标签: 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(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?

}

换句话说,我从地图中获取了一个值引用。但后来我在底层地图上进行了各种其他插入,删除等操作。原值参考仍然是好的吗?其他藏品怎么样?

而且,我怎么知道呢?我看着Stroustrup,但没有看到任何东西。

来自C背景我对引用和集合及其交互感到困惑。我应该考虑其值是参考的地图吗?这甚至意味着什么?

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

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

1 个答案:

答案 0 :(得分:9)

std::map引用会因使迭代器无效的相同操作而失效 - 这些操作在标准和cppreference.com等地方都有详细记载。

对于std::map,只要您不clear maperase具体引用的元素,引用就是有效的;插入或删除其他元素很好。例如,cpprefererence map::insert documentation表示&#34;没有迭代器或引用无效。&#34;。

您会发现有关于其他容器及其操作的陈述.... (jrok在评论中指出,推送到deque是一个操作的例子,其中引用仍然有效,但迭代器无效)。