用于访问集合c++的排序子集的数据结构

data structure for accessing sorted subsets of a set c++

本文关键字:排序 数据结构 子集 c++ 访问 集合 用于      更新时间:2023-10-16

我有一组值V,由它们的独立项I访问,即i->V[i]。我需要根据值V[i](例如,从大到小)对这些值进行迭代。此外,我有原始索引I_1, I2,..., I_N的子集,并且我需要以相同的顺序(从大到小)访问它们的相应值。

这里使用的正确数据结构和过程是什么?我已经为此挣扎了一段时间,所以我们非常感谢您的帮助。

注意,值(V[i])是不断更新的,并且访问总是通过索引i。如果我使用set来表示值,那么我需要删除更新后的元素,并将其插入回,并提示将其放在哪里(很可能它靠近集合中的前一个位置)。但一个集合只包含V,不允许我通过i访问元素。另一方面,使用MapMultimap时,元素按I而不是V排序。

我似乎需要使用指针和集合等的组合,但我无法解决。。。

你是对的,你需要一个组合。我会这么做:

std::map<SomeKey, SomeObject> sortedObjects;
std::vector<std::map<SomeKey, SomeObject>::iterator> indexedObjects;

插入对象:

indexedObjects.push_back(sortedObjects.emplace(newKey, newObject).first);

这里的想法是,对象实际上是map中的,但可以通过索引访问的vectoriterators保存到映射中的对象。关键是,除非两个容器都被修改,否则两个容器均不会被修改。您可以编写一个类,将这两个容器包装在一起,这样您就不能在不修改另一个容器的情况下修改其中一个容器,或者您可以确保永远不会犯那个错误。

通过indexedObjects中的索引和sortedObjects中的键访问元素。如果需要从中间索引添加/删除元素,请使用list而不是vector,这样就可以从容器的中间添加/删除。如果没有单独的密钥,请使用set,而不是map。如果有重复的键/对象,请使用multisetmultimap