【问题标题】:Move objects into std::map c++将对象移动到 std::map c++
【发布时间】:2013-08-06 18:23:16
【问题描述】:

我有一个树状结构

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

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

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

Compiling example with typecast

Non-compiling example without typecast

【问题讨论】:

  • 您确定不需要图表吗?
  • 在你的例子中,你正在循环你试图填充的地图。您应该遍历dir 中的文件并将它们添加到directories
  • @user245710 不。如何实现图表?我意识到我应该更多地了解数据结构。
  • 您的Key 是否可移动复制和移动分配?

标签: c++ move-semantics stdmap


【解决方案1】:

我认为您打算改为执行以下操作:

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

这是你想要的吗?

【讨论】:

  • 如果 Key 删除了复制构造函数,则不会。
  • 那么如果 Key 没有复制构造函数,move 会失败?我认为你被困在复制每个密钥。插入可能会复制他们的密钥,因此您不能在移动后使用对它的引用,因为它可能会被移动破坏。
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2023-04-10
  • 2015-03-18
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多