为啥移动 std::map 无法将元素从一个地图移动到另一个地图

Posted

技术标签:

【中文标题】为啥移动 std::map 无法将元素从一个地图移动到另一个地图【英文标题】:Why move on std::map is failing to move a element from one map to other为什么移动 std::map 无法将元素从一个地图移动到另一个地图 【发布时间】:2020-06-20 04:31:17 【问题描述】:

我正在尝试练习如何将一个地图元素移动到另一个 - 因此我尝试了以下代码:

using namespace std;

int main(void)

    /* Initializer_list constructor */
    map<char, int> m =
    
        'a', 1,
        'b', 2,
        'c', 3,
        'd', 4,
        'e', 5,
    ;

    cout << "Move element from one map to another" << endl;
    /*
    char temp;
    temp = map1[key1];
    map2[key1]=temp;
    map1.erase(key1)
    */
    string a = "hello";
    string b = move(a);
    cout << "a=" << a << " b=" << b << endl; // here string **a** is NULL as value is moved
    auto s = move(m['a']);
    cout << "s=" << s << " m=" << m['a'] <<  endl; // here 
 

输出:

Move element from one map to another                                                                                        
a= b=hello                                                                                                              
s=1 m=1                    

为什么 std::map STL 容器的移动操作失败 - 我期待在 m['a'] 之后会为空?

【问题讨论】:

这能回答你的问题吗? What lasts after using std::move c++11 【参考方案1】:

您的代码无法从地图中移除对象。这将需要在地图上进行操作,而不是其中的对象。对地图中的对象进行的任何操作都不会从地图中删除该对象。

您对地图中的对象执行的操作是将其值从中移出。对象移出后的状态是合法但不确定的。

所以地图中的对象处于有效但不确定的状态。

【讨论】:

但是我们在移动到字符串对象之后也没有做 - 为什么我们明确需要从地图中删除或删除? @Programmer 如果要从地图中删除对象,则必须在地图上执行某种“删除对象”操作。对对象的任何操作都不会将其从地图中删除,因为该对象对地图一无所知。 好吧,如果我这样做:auto s = move(m); - 这是将地图移动到另一个地图变量的正确方法吗? @Programmer 如果您尝试从地图中删除对象,则必须在地图上执行某种“删除对象”操作。将对象的值移出对象不会从地图中删除对象。将移动视为 x = y; 的优化版本,适用于您不需要将值也包含在 y 中的情况。【参考方案2】:

为什么 std::map STL 容器的移动操作失败 - 我原以为 m['a'] 之后会为空?

这种期望是没有根据的。

声明

auto s = move(m['a']);

出于几个原因保留m['a']

    该语句可以被认为是:

    int&& s = move(m['a']);
    

    即它只是捕获对地图中对象的引用。它实际上并没有移动它。

    int 上的移动操作不会改变被移动的对象。移动语义仅对类的移动构造函数有意义。对于内置类型,这是一个 noop。即使对于实际上不获取成员变量之外的任何资源的类,移动构造函数也无能为力。

另外,没有空的int 这样的东西。空的概念只对容器有意义。

【讨论】:

以上是关于为啥移动 std::map 无法将元素从一个地图移动到另一个地图的主要内容,如果未能解决你的问题,请参考以下文章

无法创建 MoveConstructibles 的地图

VS2005 中损坏的 std::map 可视化器

从嵌套在 std::map 中的 std::list 中删除元素的最佳方法

为啥我插入 std::map 失败?

std::unordered_map 如何表现? [C++]

为啥调用 std:map:clear 后内存占用率没有降低