我有一个包含 2 个字段的记录(例如 A 和 B)。如果 A 相等,则记录的 2 个实例应被视为相等。另一方面,记录实例的集合应按 B 字段排序。
是否有像 std::set 这样的容器,它可以用两个不同的谓词定义,一个用于排序,一个用于唯一性,这样我就可以避免显式排序而只附加元素?如果不是,如何解决?
问候,
最佳答案
标准库中没有任何内容可以直接支持您的用例。您可以使用 Boost.MultiIndexContainer不过,为了这个目的。像这样的事情:
typedef multi_index_container<
Record,
indexed_by<
ordered_non_unique<member<Record, decltype(Record::B), &Record::B>>,
hashed_unique<member<Record, decltype(Record::A), &Record::A>>
>
> RecordContainer;
(为简洁起见,代码假设正确的 header 和 using namespace
指令)。
这个想法是创建一个具有两个索引的容器,一个索引将保证基于B
的排序,另一个将保证基于A
的唯一性。代码中的decltype()
当然可以替换为你知道但我不知道的A
和B
的实际类型。
索引的顺序有点重要,因为为了方便起见,容器本身提供了与其第一个索引相同的接口(interface)。不过,您始终可以使用 container.get()
访问任何索引。
该代码并非旨在作为复制和粘贴解决方案,而是作为起点。您可以添加自定义、索引标签等。有关详细信息,请参阅 Boost 文档。
关于用于存储排序的唯一值的 C++ 容器,具有不同的谓词以实现排序和唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27618207/