我是否正确地假设向std :: map添加/删除元素不会影响其他元素(即使它们在内存中重新定位)并且以下是安全的:
我查看了有关容器信息的各个站点,但只发现了迭代器失效的情况,我已经知道了......
std::map<std::string,std::string> map;
PopulateMap(map);
std::string &a= map["x"];
AddMoreData(map);
RemoveRandomKeysExceptX(map);
map["x"] = "foo";
std::cout << a << " " << map["x"] << std::endl;//prints "foo foo"
a = "bar";
std::cout << a << " " << map["x"] << std::endl;//prints "bar bar"
我在VC9上测试了一些类似的代码,这似乎有用,但这并不意味着我不仅仅是幸运,也不会因编译器而异。
答案 0 :(得分:9)
标准在23.1.2/8
关于关联容器
插入成员不应影响迭代器的有效性和对容器的引用,并且擦除成员应仅使迭代器和对已擦除元素的引用无效。
答案 1 :(得分:4)
Map具有以下重要特性:将新元素插入到映射中不会使指向现有元素的迭代器无效。 引自sgi docs。
如果保证迭代器不会改变,那么它们指向的值也不会改变。
naveen之前有一个与此类似的答案。除非我的逻辑中存在错误,否则你所做的事情是安全的。
编辑2: 请参阅sgi docs中的第3点,了解如何从operator []获取值与从迭代器获取值相同。
答案 2 :(得分:0)
是的,你可以指望这一点。
// retrieve reference to string stored at "x"
// note that since [] returns a reference, it must insert an element at "x" if
// it doesn't exists (in this case an empty string)
std::string &a= map["x"];
// retrieve reference for "x" again and set value to "foo"
map["x"] = "foo";
// use already stored reference
a = "bar";