用于存储排序的唯一值的 C++ 容器,具有不同的谓词以实现排序和唯一性

标签 c++ sorting boost stl stdset

我有一个包含 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()当然可以替换为你知道但我不知道的AB的实际类型。

索引的顺序有点重要,因为为了方便起见,容器本身提供了与其第一个索引相同的接口(interface)。不过,您始终可以使用 container.get() 访问任何索引。

该代码并非旨在作为复制和粘贴解决方案,而是作为起点。您可以添加自定义、索引标签等。有关详细信息,请参阅 Boost 文档。

关于用于存储排序的唯一值的 C++ 容器,具有不同的谓词以实现排序和唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27618207/

相关文章:

c++ - 如何检查字符串是否是另一个字符串的真子集

javascript - 根据子元素的值对 div 进行排序

c++ - 使用 STL std::sort 的方式作为 qsort_r

c++ - 附加到 boost::filesystem::path

C++:让 Boost 工作;关于包含路径和链接库的问题

c++ - 在嵌套需求中,为什么使用 `requires bool_constant<X>::value;` 而不是 `requires X;` ?

c++ - 在 MSVC++ 的 STL 中插入 std::unordered_map 两次调用散列函数,糟糕的设计还是特殊原因?

c++ - 如何使用 GCC 或 Clang 构建 Objective-c++ 代码?

sorting - 如何在 dart/Flutter 中使用 SplayTreeMap on Firebase 快照字典?

c++ - 如何从(binary == true)boost::beast::websocket::stream <tcp::socket>将 'read'放入缓冲区(boost::beast::flat_buffer?),以便它不被转义?