Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ 清除多级std::map_C++_Stdmap - Fatal编程技术网

C++ 清除多级std::map

C++ 清除多级std::map,c++,stdmap,C++,Stdmap,如果我有这样的多级地图 std::map<int, std::map<int, int>> myMap; constructor() { std::map<int, int> myInsideMap; myInsideMap.insert(std::make_pair(1,2)); myMap.insert(std::make_pair(1, myInsideMap)); } destructor() { // is th

如果我有这样的多级地图

std::map<int, std::map<int, int>> myMap;

constructor() {
    std::map<int, int> myInsideMap;

    myInsideMap.insert(std::make_pair(1,2));
    myMap.insert(std::make_pair(1, myInsideMap));
}

destructor() {
    // is this cleared correctly?? recursively?
    myMap.clear();
}
std::map myMap;
构造函数(){
std::映射myInsideMap;
myInsideMap.insert(std::make_pair(1,2));
插入(std::make_pair(1,myInsideMap));
}
析构函数(){
//是否以递归方式正确清除?
myMap.clear();
}
我希望myMap.clear()也会清除myInsideMap。
它会像我预期的那样工作吗?

是的,地图将销毁所有组件。你可能想了解一下

我希望myMap.clear()也会清除myInsideMap。它会像我预期的那样工作吗

否。
myMap.clear()
将销毁自己的
myInsideMap
副本<退出
构造函数()
作用域后,code>myMap将不再存在


标准库容器拥有自己的元素。当它们被清除或不复存在时,它们的元素也会被破坏。

引用标准第23.2.1节中关于一般容器要求的注释:

析构函数应用于一个函数的每个元素;所有内存都已释放。

我希望myMap.clear()也会清除myInsideMap

没有。myMap只清除mapMap的内容,mapMap内部包含一个std::pair对象,该对象又有一个myInsideMap的副本

myInsideMap是在堆栈上分配的,因此当构造函数()退出时,当其局部作用域结束时,它将被解除分配。同样,这不是破坏myMap中的myInsideMap(副本)的地方

这是否正确清除??递归地


是的,myMap在这里被清除,但是递归销毁如下所示-std::pair析构函数在内部被调用,其键和值被销毁。由于myInsideMap的副本是该对结构中的值,因此该内容也会被销毁。因此,破坏性的“递归”不会触及构造函数()中的本地或实际myInsideMap。

调用后,map
myMap
中的数据已被销毁,因此这个问题实际上是没有意义的,因为“内部”映射不再存在。您可以轻松地将调试输出添加到包含对象的析构函数中,以找到答案。也就是说,考虑在地图中使用两个int作为键,如<代码> map < /代码>。我的直觉是这更接近你想要表达的内容。它不会清除myInsideMap,但它会破坏它包含的所有地图
myInsideMap
是构造函数本地的,因此当构造函数退出时它会被销毁。但是
myInsideMap
不是
myMap
的组件,因此它不会被清除。