在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;
}

为什么它能工作?

它不"工作";。

程序的行为未定义。

期望它转储核心

你的期望被误导了。该程序没有被定义为";转储堆芯;当您间接通过无效迭代器时。没有为此类程序定义任何行为。因此,任何行为都是可能的。在所有可能的行为中,有一种可能性是,这种行为是你没有预料到的,或者是你认为的";工作";。

最新更新