STL允许使用指向不同地图的迭代器擦除地图的键/值?

Har*_*eka 4 c++ stl stdmap erase

所以,我偶然发现的是:

std::map<double, int> map1;
std::map<double, int> map2;

map1[2.5] = 11;
map1[3.5] = 12;

map2[2.5] = 21;
map2[3.5] = 22;

std::map<double, int>::iterator iterMap1 = map1.find(2.5);

//I will now try to erase a key/value pair in map2 with an iterator 
//that points to map1. This is bad/wrong. But I am surprised 
//this is allowed. 
map2.erase(iterMap1); 

//what do you think would be printed?
print(map1);
print(map2);
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这种行为吗?我认为不应该允许这样做.

我得到的输出是:

Map1
2.5 11

Map2
2.5 21
3.5 22
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.谢谢.

Dav*_*eas 5

你是什​​么意思允许的?它在标准中是不允许的,并且会导致未定义的行为,但这并不意味着编译器必须对您进行尝试而大喊大叫.

在一般情况下,编译器无法检查.映射和迭代器可以传递给函数,并且没有任何方法可以知道迭代器是否引用容器,因此不能强制编译器对其进行诊断.

程序员可以编写有效且正确的程序.编译器是帮助但不是保姆.

  • @HarshitSureka:强制要求*有点*违背语言的哲学,因为它会导致所有函数的成本调用惩罚所有优秀用户以帮助诊断不良用途.话虽这么说,作为一种实现的质量,一些标准库提供了*checked iterator*实现,它们将检测到并抱怨,无论是异常还是断言 (2认同)