首页 > 解决方案 > 是否可以让 boost multi_index 容器索引一个具有 2 个键值的元素?

问题描述

我想让我的 boost multi_index 容器索引一个元素,该元素在同一索引上有多个键值。那可能吗?

struct Student {
    int Id;
    std::unordred_set<std::string> Clubs;
};

假设这个学生属于技术和电影俱乐部,并且我在 Id 上有唯一的散列索引,在俱乐部上有 non_unique 的散列索引(我想通过查看俱乐部名称来了解每个俱乐部中的学生)。

我希望能够通过使用 boost multi_index 搜索“技术”或“电影”来找到同一个学生。是否可以使用 boost 或者我需要推出自己的数据存储?

标签: c++boostboost-multi-index

解决方案


您不能使用包含您的Student类型的 multi_index 来执行此操作,但您可以使用(基于它的东西)与不同的类型。

using Id_t = int;
using Club_t = std::string;
using StudentClubs = boost::bimap<boost::bimap::multiset_of<Id_t>, boost::bimap::multiset_of<Club_t>>;

StudentClubs student_clubs = /* some data */;

然后您可以查找电影俱乐部中的所有学生

for (auto [club, student] : boost::iterator_range(student_clubs.right.equal_range("movie"))) {
    std::cout << student;
}

或者学生 3 所在的所有俱乐部

for (auto [student, club] : boost::iterator_range(student_clubs.left.equal_range(3))) {
    std::cout << club;
}

推荐阅读