C++ 将对象移动到std::map c++;
我有一个树状结构C++ 将对象移动到std::map c++;,c++,move-semantics,stdmap,C++,Move Semantics,Stdmap,我有一个树状结构 class Directory { public: void merge(Directory&& dir); private: std::map<Key, Directory> directories; }; 在不可复制类型密钥上,此操作失败,密钥出现“已删除副本”错误。emplace能解决这个问题吗?如果是这样的话,我如何为不支持该方法的4.8以上的gcc使用变通方法
class Directory
{
public:
void merge(Directory&& dir);
private:
std::map<Key, Directory> directories;
};
在不可复制类型密钥上,此操作失败,密钥出现“已删除副本”错误。emplace能解决这个问题吗?如果是这样的话,我如何为不支持该方法的4.8以上的gcc使用变通方法
EDIT:我发现迭代器返回的键是const,我不应该更改该键,因为这将导致查找失败。但是,我将不再需要密钥,所以现在我想知道在这种情况下,是否可以先将类型转换为non-const安全
我想你是想做以下事情:
while(i!=dir.directories.end()) {
directories.insert(std::move(*i));
++i;
}
实际上,您正在当前目录
映射中循环条目,该映射可能为空。这将在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;
};
类目录{
公众:
无效合并(目录和目录){
std::map::iterator i=dir.directories.begin();
而(i!=dir.directories.end()){
插入(std::move(*i));
++一,;
}
}
私人:
地图目录;
};
这就是您想要的吗?您确定不需要图形吗?在您的示例中,您正在尝试填充的地图上循环。您应该在
dir
中循环文件,并将它们添加到目录中。@user245710否。如何实现图形?我意识到我应该更多地了解数据结构。您的键是否可以复制和分配移动?如果键删除了复制构造函数,则不会。因此,如果键没有复制构造函数,则移动失败?我想你在复制每一把钥匙。插入可能会复制它们的关键点,因此在移动后不能使用对它的引用,因为它可能会被移动破坏。
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;
};