从无序关联容器中移动对象

问题描述

| 在c ++ 0x中,有什么方法可以将对象从无序的关联容器中移出?我需要合并两个单独的无序集合,并且在涉及到右值的情况下,我想在即将终止的集合中“回收”项目。 事实是,unordered_set的迭代器仅提供对存储项的const引用。最初,我曾考虑过使用const_cast来放弃const-ness,但是在进一步阅读之后,似乎会导致未定义的行为。有什么建议吗? 编辑 举一个简单的例子:
#include <string>
#include <unordered_set>

using namespace std;

void merge_sets(unordered_set<string> &s1,unordered_set<string> &&s2)
{
   // Something like this,which (of course) does not work.
   for (auto it = s2.begin(); it != s2.end(); ++it) {
     s1.insert(std::move(*it));
   }
}

int main()
{
   unordered_set<string> s1,s2;
   // Fill first set:
   s1.insert(\"hello\");
   s1.insert(\"world\");
   // Fill second set.
   s2.insert(\"foo\");
   merge_sets(s1,std::move(s2));
   // After this operation,s2 is empty and s1 contains \"hello\",\"world\" and \"foo\".
}
换句话说,我希望能够从s2移动项目,而不是复制它们。应该有一种从集合中“提取”项目的方法,使该项目被复制/移动然后从当前集合中删除。     

解决方法

        为什么不通过使用其中一个作为目标来合并这两个集合,而不是将它们合并为第三个单独的集合呢?这至少可以让您避免从其中一个源集中复制元素(大概是选择较大的一个)。 或者,如果元素很大,则应使用智能指针(例如
boost::shared_ptr<>
)间接存储它们,在这种情况下,很容易将指针从两个源复制到目标,而从不复制实际对象。     ,        当前规范中没有此类功能。但是您并不孤单。将来,我们可能会获得此功能,但前提是像您这样的人会在需要它时大声喧noise。 LWG 839版的注释带有标记为“ [[2009-09-19 Howard添加:] \”,该注释描述了用于将节点从一个基于节点的容器拼接到另一个容器的API。使用您的代码看起来像:
void merge_sets(unordered_set<string> &s1,unordered_set<string> &&s2)
{
   // Something like this,which (of course) does not work.
   for (auto it = s2.begin(); it != s2.end();) {
     s1.insert(s2.remove(it++));
   }
}
这将不涉及任何内存分配或释放。它甚至不需要从元素中移动或复制。它实际上将一个节点从一个“ 3”传递到另一个。 告诉您的国家机构代表您需要此功能。告诉comp.std.c ++您需要此功能。如果您不确定此API是否满足您的需求,请私下或在这里问我,我会澄清是否可以。     ,        您不能更改Set中的元素(有序或无序),因为这会破坏唯一性保证。