【问题标题】:Lifetime of references in STD collectionsSTD 集合中引用的生命周期
【发布时间】:2014-06-29 07:20:48
【问题描述】:

对由 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 背景,我对引用和集合及其交互感到困惑。我是否应该考虑其值本身就是引用的地图?这意味着什么?

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

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

【问题讨论】:

  • STD 在大写时是一个令人困惑的首字母缩略词;-)
  • @rubenvb - 是的...... “性病收藏中的一生记忆”

标签: c++ c++11 map std


【解决方案1】:

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

总结为std::map,只要不clearmap,或者erase具体引用的元素,引用都是有效的;插入或删除其他元素很好。例如,cpprefererence map::insert documentation 表示“没有迭代器或引用无效。”。

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

【讨论】:

  • 好的,谢谢。使用值类型为引用的映射的语义怎么样,例如地图 。例如,我是否可以保证地图所做的任何事情都不会影响它指向的底层员工?
  • @kdog:您不能拥有“值类型为引用的地图”......不允许。参见例如here
  • C++11 规范明确规定(§23.2.1[container.requirements.general]/1):容器是存储其他对象的对象。
  • 存在迭代器无效但引用无效的情况,例如推送到deque
  • 谢谢,非常感谢您提供的出色答案以及指向其他信息来源的指针(或参考)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2017-06-18
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2013-02-23
相关资源
最近更新 更多