首页 > 解决方案 > 在 C++ 映射上使用迭代器擦除

问题描述

我遇到了以下行为:我创建了一个地图,在键上进行查找并删除了地图条目。擦除后,我使用迭代器打印元素,我希望它能够转储核心,但它可以工作。

为什么它有效?

     typedef std::pair<std::string, int> pair;
    std::map<pair, int> nameidCntMap;

    pair pair1("ABC", 139812);
    pair pair2("XYZ", 139915);
    pair pair3("PQR", 139098);


    nameidCntMap.insert(std::make_pair(pair1, 1));
    nameidCntMap.insert(std::make_pair(pair2, 1));
    nameidCntMap.insert(std::make_pair(pair3, 1));

    std::map<pair, int>::iterator it = nameidCntMap.find(pair1);
    if (it != nameidCntMap.end())
    {
            symsrcidCntMap.erase(it);
   
            std::cout<<"Pair::first: "<<it->first.first << "Pair::second: "<<it->first.second<<"map second:"<<it->second<<std::endl;
    }

标签: c++dictionaryiteratorbehaviorerase

解决方案


为什么它有效?

它不“工作”。

程序的行为未定义。

预计它会转储核心

你的期望是错误的。当您间接通过无效的迭代器时,该程序未定义为“转储核心”。没有为此类程序定义任何行为。因此,任何行为都是可能的。在所有可能的行为中,这种行为有可能是您没有预料到的,或者您认为是“工作”的行为。


推荐阅读