将对象移动到std :: map c ++中

时间:2013-08-06 18:23:17

标签: c++ move-semantics stdmap

我有一个树状的结构

class Directory
     {
     public:
         void merge(Directory&& dir);

     private:
         std::map<Key, Directory> directories;
     };

merge将dir中的每个子目录移动到目录中。这可以在不复制所有密钥和目录的情况下完成吗?

我试着说

auto i=dir.begin();
while(i!=dir.end())
    {
    directories.insert(std::move(*i));
    ++i;
    }

在非可复制类型的密钥上,此操作因密钥的已删除复制密钥错误而失败。安德拉会解决这个问题吗?如果是这样,我如何使用不支持该方法的gcc早于4.8的解决方法?

编辑:我发现迭代器返回的密钥是const,我不应该更改密钥,因为这将导致查找:s失败。 但是,我需要密钥,所以现在我想知道在这种情况下是否可以安全地首先对非const进行类型转换。

Compiling example with typecast

Non-compiling example without typecast

1 个答案:

答案 0 :(得分:0)

我认为你打算做以下事情:

  while(i!=dir.directories.end()) {
    directories.insert(std::move(*i));
    ++i;
  }

实际上,您正在循环显示当前directories地图中的条目,该地图可能为空。这将循环遍历dir中的目录,并将每个目录复制到您的本地地图中。

编辑:看到你的回复。我得到了这个编译:

class Directory {
public:
  void merge(Directory& dir) {
    std::map<Key, Directory>::iterator i=dir.directories.begin();
    while(i!=dir.directories.end()) {
      directories.insert(std::move(*i));
      ++i;
    }
  }

private:
  std::map<Key, Directory> directories;
};

这就是你想要的吗?