0

我有一个树状结构

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

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

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

我试着说

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

在不可复制类型的 Key 上,这将失败,并显示 Key 的已删除复制 ctor 错误。安顿会解决问题吗?如果是这样,我该如何为不支持该方法的 4.8 之前的 gcc 使用解决方法?

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

使用类型转换编译示例

没有类型转换的非编译示例

4

1 回答 1

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;
};

那是你想要的吗?

于 2013-08-06T18:30:42.123 回答