我有一个包含 2 个字段(例如 A 和 B)的记录。如果它们的 As 相等,则应将记录的 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;
(为简洁起见,代码假设正确的标题和using namespace
指令)。
这个想法是创建一个具有两个索引的容器,一个将保证基于的排序B
,另一个将保证基于 的唯一性A
。decltype()
在代码中当然可以用你知道的实际类型替换A
,B
但我不知道。
索引的顺序有点重要,因为为方便起见,容器本身提供与其第一个索引相同的接口。不过,您始终可以使用 访问任何索引container.get()
。
该代码并非旨在作为复制和粘贴解决方案,而是作为起点。您可以添加自定义、索引标签等。有关详细信息,请参阅 Boost 文档。
有没有像 std::set 这样的容器,可以用两个不同的谓词定义,一个用于排序,一个用于唯一性
std::set 根据您提供给它的排序标准定义特定元素是否唯一(默认情况下它使用 less<>)。无需显式传递另一个标准来检查元素的相等性。然而,话虽如此,您可以使用带有算法的谓词来检查 std::set 的元素是否相等。