我有几个class A
的对象。在另一些class B
中,我要保留class A
的对象的无序集。请注意,类B的对象因此包含一个集合,该集合可能指向与另一个集合相同的(类)A类对象。要求这些A类对象绝不能复制或任何其他内容,因为它们包含应该由class B
和class A
的不同对象使用和更改(共享)的成员数据。
首先,由于我来自C语言,所以我认为仅使用指向对象的指针作为集合中的值。但是,在编码后,我看到我现在还需要传递重写的哈希和相等功能,因为我必须比较class A
的私有成员上A类的对象是否相等。因此,散列函数需要是class A
的公共成员函数。
但是,我想知道,由于std::unordered_set::insert()
似乎采用了[[对value_type的引用
std::unordered_set
的值类型。这将使代码容易得多,因为默认情况下它将使用在== operator
中已实现的class A
。但是,我不确定std::unordered_set::insert()
是否复制您传递给它的对象。似乎没有,但是value_type仍然是A,而不是A&。我也看不到std::unordered_set::insert()
和std::unordered_set::emplace()
之间的区别。我不明白“复制与移动”的含义。TLDR:要在集合或映射中保留对用户定义类的对象的引用,在这种情况下是否可以将A*
用作value_type?还是std::reference_wrapper<A>
?还是只是普通的A
?
这是最小的可复制示例:
class A {
public:
bool operator== (A& other);
private:
B* b;
size_t id;
size_t someIntThatMustBeShared;
};
class B {
public:
std::unordered_set<A ? > as;
};
我有几个类A的对象。在其他一些类B中,我想保留类A的对象的unordered_set。请注意,类B的对象因此包含一个可能指向的对象(集合)。 ..
DISCLAIMER
:我是OP,并且是C ++的新手,所以我对下面答案的正确性不是100%的。但是,我的代码现在可以按预期方式编译和运行。