如何获取有序非唯一提升多索引集的某些索引字段的唯一值
how to get unique values of certain index field of ordered non unique boost multi index set
我制作了多个索引的 boost 多索引集,其中大多数索引都是非唯一的。
现在我需要使用迭代器对集合进行循环以获取有序的非唯一索引,但我需要跳过具有相同非唯一值的结构。
换句话说,我只需要使用这个有序的非唯一键的唯一值来循环。
有没有办法只识别非唯一键中的唯一值并使用这个唯一值循环??
我没有放代码,因为这是我正在寻找的一般方法。
我知道 std::unique 但我不想制作另一个容器,因为在制作容器的过程中原始容器正在被修改,这让我很难同步。
您可以使用容器的 upper_bound
函数遍历容器。这是工作示例:
struct MyStruct {
int group_id, id;
};
struct ByGroupID {};
using StructContainer = boost::multi_index_container<
MyStruct,
boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<ByGroupID>,
boost::multi_index::member<MyStruct, int, &MyStruct::group_id>
>
>
>;
int main() {
StructContainer my_structs;
my_structs.insert({1, 1});
my_structs.insert({1, 2});
my_structs.insert({1, 3});
my_structs.insert({2, 4});
my_structs.insert({2, 5});
my_structs.insert({3, 6});
auto &by_group_id = my_structs.get<ByGroupID>();
for (auto it = by_group_id.begin(); it != by_group_id.end();) {
std::cout << it->group_id << "\n";
it = by_group_id.upper_bound(it->group_id);
}
}
输出1、2、3。
我制作了多个索引的 boost 多索引集,其中大多数索引都是非唯一的。
现在我需要使用迭代器对集合进行循环以获取有序的非唯一索引,但我需要跳过具有相同非唯一值的结构。
换句话说,我只需要使用这个有序的非唯一键的唯一值来循环。
有没有办法只识别非唯一键中的唯一值并使用这个唯一值循环??
我没有放代码,因为这是我正在寻找的一般方法。
我知道 std::unique 但我不想制作另一个容器,因为在制作容器的过程中原始容器正在被修改,这让我很难同步。
您可以使用容器的 upper_bound
函数遍历容器。这是工作示例:
struct MyStruct {
int group_id, id;
};
struct ByGroupID {};
using StructContainer = boost::multi_index_container<
MyStruct,
boost::multi_index::indexed_by<
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<ByGroupID>,
boost::multi_index::member<MyStruct, int, &MyStruct::group_id>
>
>
>;
int main() {
StructContainer my_structs;
my_structs.insert({1, 1});
my_structs.insert({1, 2});
my_structs.insert({1, 3});
my_structs.insert({2, 4});
my_structs.insert({2, 5});
my_structs.insert({3, 6});
auto &by_group_id = my_structs.get<ByGroupID>();
for (auto it = by_group_id.begin(); it != by_group_id.end();) {
std::cout << it->group_id << "\n";
it = by_group_id.upper_bound(it->group_id);
}
}
输出1、2、3。