gpt4 book ai didi

c++ - 如何使用提取将不可复制元素从 std::set move 到 std::map?

转载 作者:行者123 更新时间:2023-12-01 14:13:02 24 4
gpt4 key购买 nike

考虑以下几点:

#include <set>
#include <map>

struct MyClass
{
MyClass(int i);
MyClass(MyClass const&) = delete;
~MyClass();

bool operator<(const MyClass& r) const { return v < r.v; }
int v;
};

void map_set_move_test()
{
std::set<MyClass> s1, s2;
std::map<int, MyClass> m1;

s1.emplace(123);

s2.insert(std::move(s1.extract(s1.begin())));

// This fails
m1.insert(std::move(std::make_pair(1, std::move(s2.extract(s2.begin()).value()))));
}

我使用 std::set::extract 成功地将一个元素从 std::set move 到另一个 std::set,如:

s2.insert(std::move(s1.extract(s1.begin())));

但编译器不允许以这种方式将元素 move 到 std::map:

m1.insert(std::move(std::make_pair(1, std::move(s2.extract(s2.begin()).value()))));

任何帮助将不胜感激。 Link to compiler explorer .

最佳答案

这是一个有问题的例子,因为 MyClass 不仅是不可复制的,而且隐含地 不可 move - 这可能不是您的意思。 (我认为 MyClass 由于您显式删除复制构造函数而变得不可 move ;参见 this answer。)

如果您确实使 MyClass 可 move ,如下所示:

class MyClass : NonCopyable
{
public:
MyClass(int i) : v(i) {
std::cout << "constructor" << std::endl;
}
MyClass(MyClass&& other) : v(other.v) {
std::cout << "move constructor" << std::endl;
}
~MyClass() {
std::cout << "destructor" << std::endl;
}
bool operator<(const MyClass& r) const {
return v < r.v;
}

int v;
};

一切似乎都很顺利,当你写的时候,说。

m1.emplace(
1,
std::move(
s2.extract(s2.begin()).value()
)
);

您可以在 GodBolt 上看到它正在运行.


PS - 正如@DavisHerring 所建议的,如果您不想覆盖现有值,您可能想改用 try_emplace() 方法。

关于c++ - 如何使用提取将不可复制元素从 std::set move 到 std::map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63428912/

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