【发布时间】:2021-12-23 16:47:17
【问题描述】:
std::map<int, Obj> mp;
// insert elements into mp
// case 1
std::map<int, Obj> mp2;
mp2 = std::move(mp);
// case 2
std::map<int, Obj> mp3;
std::move(std::begin(mp), std::end(mp), std::inserter(mp3, std::end(mp3));
我对这两种情况感到困惑。它们完全一样吗?
【问题讨论】:
-
第一个具有恒定时间复杂度,第二个具有nlogn时间复杂度。
-
不,它们不一样。请注意,第二种情况下的目的地地图可能有点不同(例如有不同的顺序)。案例1超级快,案例2必须为
mp3分配一些map内部结构。 -
请注意,第一个副本只是将整个树从第一个映射移动到第二个,第一个(通常)保持为空,而第二个变体由于
std::move的性质将第二个树中的节点保留为是,只是它们的内容被移动:假设std::map<std::vector<...>>,则向量的内容被移动,而第一个地图中的向量本身保持不变(通常为空)。
标签: c++ c++11 move stdmap c++-standard-library