是否有一种方法可以将对对象的引用/指针保留在unordered_set中?

问题描述 投票:-1回答:1

我有几个class A的对象。在另一些class B中,我要保留class A的对象的无序集。请注意,类B的对象因此包含一个集合,该集合可能指向与另一个集合相同的(类)A类对象。要求这些A类对象绝不能复制或任何其他内容,因为它们包含应该由class Bclass A的不同对象使用和更改(共享)的成员数据。

首先,由于我来自C语言,所以我认为仅使用指向对象的指针作为集合中的值。但是,在编码后,我看到我现在还需要传递重写的哈希和相等功能,因为我必须比较class A的私有成员上A类的对象是否相等。因此,散列函数需要是class A的公共成员函数。

但是,我想知道,由于std::unordered_set::insert()似乎采用了[[对value_type的引用

,因此是否可以仅将A用作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的对象因此包含一个可能指向的对象(集合)。 ..
c++ pointers reference stl unordered-set
1个回答
0
投票

DISCLAIMER

:我是OP,并且是C ++的新手,所以我对下面答案的正确性不是100%的。但是,我的代码现在可以按预期方式编译和运行。
© www.soinside.com 2019 - 2024. All rights reserved.