gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:03:25 27 4
gpt4 key购买 nike

在 c++0x 中是否有任何方法可以将对象从无序关联容器中移出?我需要合并两个单独的无序集,如果涉及右值,我想“回收”即将停止的集中的项目。

事实上,unordered_set 的迭代器只提供对存储项的常量引用。我最初想过使用 const_cast 来丢弃常量,但在进一步阅读后,这似乎会导致未定义的行为。有什么建议吗?

编辑

举个简单的例子:

#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 移动项目而不是复制它们。应该有一种方法可以从集合中“提取”项目,即复制/移动项目,然后从当前集中删除项目。

最佳答案

当前规范中没有这样的功能。但您并不是唯一提出要求的人。我们有可能在未来获得此功能,但前提是像您这样的人大声疾呼需要它。

LWG issue 839有一条标记为“[ 2009-09-19 Howard adds: ]”的评论,它描述了一种用于将节点从一个基于节点的容器拼接到另一个的 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++));
}
}

这不会涉及任何内存分配或释放。它甚至不需要从您的元素中移动或复制。它从字面上传递了一个节点 unordered_set<string>给另一个。

告诉您的国家机构代表您需要此功能。告诉 comp.std.c++ 你需要这个功能。如果您不确定此 API 是否满足您的需求,请私下或在这里询问我,我会在可以的情况下进行澄清。

关于c++ - 从无序关联容器中移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6181003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com