C++ map::find安全吗?
我试图测试std:map中的“find”是否安全,所以在使用“find”测试元素之后,我删除了一个元素,但是元素的迭代器仍然有效。即使我使用“再次查找”,它也会再次查找已擦除的元素 根据文件: 引用函数删除的元素的迭代器、指针和引用无效。 所有其他迭代器、指针和引用都保持其有效性C++ map::find安全吗?,c++,C++,我试图测试std:map中的“find”是否安全,所以在使用“find”测试元素之后,我删除了一个元素,但是元素的迭代器仍然有效。即使我使用“再次查找”,它也会再次查找已擦除的元素 根据文件: 引用函数删除的元素的迭代器、指针和引用无效。 所有其他迭代器、指针和引用都保持其有效性 为什么第二个迭代器autoit_2=numeros.find(“uno”)是否查找已擦除的元素 为什么std::cout首先numeros.erase(“uno”)根据您的报价使迭代器失效。这意味着不再允许您取消对迭
- 为什么第二个迭代器
autoit_2=numeros.find(“uno”)代码>是否查找已擦除的元素
- 为什么
std::cout首先
numeros.erase(“uno”)代码>根据您的报价使迭代器失效。这意味着不再允许您取消对迭代器的引用。无论如何,这样做是有好处的 因此,您的程序具有未定义的行为,因为您在下一行中取消了对迭代器的引用
找不到已擦除的元素。如果std::cout << it->first << " : " << it->second << std::endl;
没有找到任何元素,它将返回结束迭代器.find
的过去值,这就是此处发生的情况。在结束迭代器中取消对过去迭代器的引用也有未定义的行为。那么下面的一行呢numeros.end()
std::cout << it_2->first << " : " << it_2->second << std::endl;
numeros.erase(“uno”)代码>根据您的报价使迭代器失效。这意味着不再允许您取消对迭代器的引用。无论如何,这样做是有好处的 因此,您的程序具有未定义的行为,因为您在下一行中取消了对迭代器的引用
找不到已擦除的元素。如果std::cout << it->first << " : " << it->second << std::endl;
没有找到任何元素,它将返回结束迭代器.find
的过去值,这就是此处发生的情况。在结束迭代器中取消对过去迭代器的引用也有未定义的行为。那么下面的一行呢numeros.end()
std::cout << it_2->first << " : " << it_2->second << std::endl;
使所有当前映射迭代器无效,如果在此之后取消引用一个,则会调用未定义的行为。另外,erase
将是一个结束迭代器,再次解除它将调用ub,但您可以在解除引用之前测试它是否为it_2
。在我的编译器numeros.end()
中,它不打印it_2
,它会崩溃。您应该在使用它之前检查它。在uno:1
删除
它指向的元素后,通过取消引用
获得正确的结果并不能保证您正在观察定义的行为。确实,正如@George所指出的,您正在观察未定义的行为。@masoud我使用的是clang++Apple clang 11.0.0版,它会打印此输出,但正如walnut所说,我的程序有未定义的行为,在其他编译器下它可以做任何事情。它
使所有当前的映射迭代器无效,如果在此之后取消引用一个,则会调用未定义的行为。另外,erase
将是一个结束迭代器,再次解除它将调用ub,但您可以在解除引用之前测试它是否为it_2
。在我的编译器numeros.end()
中,它不打印it_2
,它会崩溃。您应该在使用它之前检查它。在uno:1
删除
它指向的元素后,通过取消引用
获得正确的结果并不能保证您正在观察定义的行为。确实,正如@George所指出的,您正在观察未定义的行为。@masoud我使用的是clang++Apple clang 11.0.0版,它会打印此输出,但正如walnut所说,我的程序有未定义的行为,在其他编译器下它可以做任何事情。是的,就是这样!我用它
=>.end()
if(it_2==numeros.end()){std::cout是的!我用
=>.end()
if(it_2==numeros.end()){std::cout检查过了
std::cout << it_2->first << " : " << it_2->second << std::endl;
if(it_2 != numeros.end()) { std::cout << it_2->first << " : " << it_2->second << std::endl; } else { std::cout << "uno not found!" << std::endl; }