清除多级 std::map
clear multi-level std::map
如果我有这样的多级地图,
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();
}
我预计 myMap.clear() 也会清除 myInsideMap。
它会像我预期的那样工作吗?
是的,地图会破坏所有组件。您可能想阅读有关 destructor for map.
的内容
I expect myMap.clear() will clear myInsideMap too. would it be working that I expected?
没有。 myMap.clear()
将销毁它自己的 myInsideMap
的 copy。 myMap
将在 constructor()
作用域退出时不复存在。
标准库容器拥有自己的元素。当它们被清除或不复存在时,它们的元素也会被销毁。
引用标准第 23.2.1 节中关于一般容器要求的注释:
析构函数应用于a的每个元素;所有内存都被释放。
I expect myMap.clear() will clear myInsideMap too
没有。 myMap 仅清除 mapMap 的内容,其中包含一个 std::pair 内部对象,而该对象又具有 myInsideMap 的副本。
myInsideMap 被分配在堆栈上,因此当 constructor() 退出时它的局部范围结束时它被释放。同样,这不是 myMap 内部的 myInsideMap(副本)被破坏的地方。
is this cleared correctly?? recursively?
是的,myMap 在这里被清除,但是递归销毁发生如下 - std::pair 析构函数在内部被调用,键和值被销毁。由于 myInsideMap 的副本是此对结构中的值,因此该内容也被销毁了。所以破坏性的 "recursion" 不会触及 constructor() 中的本地或实际的 myInsideMap。
如果我有这样的多级地图,
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();
}
我预计 myMap.clear() 也会清除 myInsideMap。 它会像我预期的那样工作吗?
是的,地图会破坏所有组件。您可能想阅读有关 destructor for map.
的内容I expect myMap.clear() will clear myInsideMap too. would it be working that I expected?
没有。 myMap.clear()
将销毁它自己的 myInsideMap
的 copy。 myMap
将在 constructor()
作用域退出时不复存在。
标准库容器拥有自己的元素。当它们被清除或不复存在时,它们的元素也会被销毁。
引用标准第 23.2.1 节中关于一般容器要求的注释:
析构函数应用于a的每个元素;所有内存都被释放。
I expect myMap.clear() will clear myInsideMap too
没有。 myMap 仅清除 mapMap 的内容,其中包含一个 std::pair 内部对象,而该对象又具有 myInsideMap 的副本。
myInsideMap 被分配在堆栈上,因此当 constructor() 退出时它的局部范围结束时它被释放。同样,这不是 myMap 内部的 myInsideMap(副本)被破坏的地方。
is this cleared correctly?? recursively?
是的,myMap 在这里被清除,但是递归销毁发生如下 - std::pair 析构函数在内部被调用,键和值被销毁。由于 myInsideMap 的副本是此对结构中的值,因此该内容也被销毁了。所以破坏性的 "recursion" 不会触及 constructor() 中的本地或实际的 myInsideMap。