对 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?
}
换句话说,我从地图中获取了一个值引用。但随后我会在底层地图上进行各种其他插入、删除等操作。原来的价值参考还好吗?那么其他收藏呢?
而且,我怎么知道这一点?我看了看斯特鲁斯特鲁普,但什么也没看到。
来自 C 背景的我对引用和集合以及它们的交互感到困惑。我是否应该考虑其值本身就是引用的地图?这意味着什么?
因此,一个更普遍的问题是:我在哪里可以找到这个问题和类似问题的规范答案?
[这是已删除问题的修订版]
std::map
使迭代器无效的相同操作会使引用无效 - 这在标准和 cppreference.com 等地方都有详细记录。
总结为std::map
,只要您不这样做,参考文献就有效clear
the map
, or erase
具体引用的元素;插入或删除其他元素就可以了。例如,cpprefererence 映射::插入文档 http://en.cppreference.com/w/cpp/container/map/insert说“没有迭代器或引用无效。”。
你会发现有关于其他容器及其操作的声明......
(jrok 在评论中指出,推动deque
是引用保持有效但迭代器无效的操作示例)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)