Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL允许删除映射';使用指向不同映射的迭代器设置s键/值?_C++_Stl_Stdmap_Erase - Fatal编程技术网

C++ STL允许删除映射';使用指向不同映射的迭代器设置s键/值?

C++ STL允许删除映射';使用指向不同映射的迭代器设置s键/值?,c++,stl,stdmap,erase,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 p

因此,我偶然发现:

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);
这对我来说毫无意义。谢谢

有人能解释一下这种行为吗

也许,但这将是浪费时间,因为它是未定义的行为,并且可能会因实现而异

我认为这是不允许的


你说得对。这是不允许的。但是这个限制是放在你身上的,你是代码的作者,而不是编译器。一旦您违反了规则,编译器就可以自由地做任何最方便的事情。

您认为允许这样做是什么意思?这在标准中是不允许的,并且会导致未定义的行为,但这并不意味着编译器必须因为您试图这么做而对您大喊大叫

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


由程序员来编写有效和正确的程序。编译器的作用是提供帮助,但不是保姆。

可能不是编译器错误。但我认为当一个对象试图修改不在其内存范围内的数据时,STL会抛出一个异常。@HarshitSureka:强制这样做有点违背语言的理念,因为它会导致所有函数调用的成本,惩罚所有好的用户以帮助诊断坏的使用。也就是说,作为一种实现质量,一些标准库提供了检查迭代器实现,这些迭代器实现将检测到这种情况并进行投诉,无论是异常还是断言
Map1
2.5 11

Map2
2.5 21
3.5 22