C++ map::find安全吗?

C++ map::find安全吗?,c++,C++,我试图测试std:map中的“find”是否安全,所以在使用“find”测试元素之后,我删除了一个元素,但是元素的迭代器仍然有效。即使我使用“再次查找”,它也会再次查找已擦除的元素 根据文件: 引用函数删除的元素的迭代器、指针和引用无效。 所有其他迭代器、指针和引用都保持其有效性 为什么第二个迭代器autoit_2=numeros.find(“uno”)是否查找已擦除的元素 为什么std::cout首先numeros.erase(“uno”)根据您的报价使迭代器失效。这意味着不再允许您取消对迭

我试图测试std:map中的“find”是否安全,所以在使用“find”测试元素之后,我删除了一个元素,但是元素的迭代器仍然有效。即使我使用“再次查找”,它也会再次查找已擦除的元素

根据文件:

引用函数删除的元素的迭代器、指针和引用无效。 所有其他迭代器、指针和引用都保持其有效性

  • 为什么第二个迭代器
    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
    使所有当前映射迭代器无效,如果在此之后取消引用一个,则会调用未定义的行为。另外,
    it_2
    将是一个结束迭代器,再次解除它将调用ub,但您可以在解除引用之前测试它是否为
    numeros.end()
    。在我的编译器
    it_2
    中,它不打印
    uno:1
    ,它会崩溃。您应该在使用它之前检查它。在
    删除
    它指向的元素后,通过取消引用
    获得正确的结果并不能保证您正在观察定义的行为。确实,正如@George所指出的,您正在观察未定义的行为。@masoud我使用的是clang++Apple clang 11.0.0版,它会打印此输出,但正如walnut所说,我的程序有未定义的行为,在其他编译器下它可以做任何事情。
    erase
    使所有当前的映射迭代器无效,如果在此之后取消引用一个,则会调用未定义的行为。另外,
    it_2
    将是一个结束迭代器,再次解除它将调用ub,但您可以在解除引用之前测试它是否为
    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;
    }