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

时间:2014-02-14 18:36:48

标签: c++ sorting data-structures map set

我有一组值V,可以通过I来访问i->V[i]。 我需要根据值V[i]迭代这些(例如从大到小)。 此外,我有原始indecies I_1, I2,..., I_N的子集,我需要以相同的顺序(从大到小)访问它们的相应值。

这里使用的数据结构和程序是什么?我已经在这方面苦苦挣扎了一段时间,所以感谢任何帮助。

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

似乎我需要使用指针和套装等的组合,但我无法弄清楚......

1 个答案:

答案 0 :(得分:0)

你是对的,你需要一个组合。这就是我要做的事情:

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

插入一个对象:

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

这里的想法是,map中的对象实际上是 ,而vector可以通过索引访问iterator来保存indexedObjects对象地图。关键是两个容器都没有被修改,除非两者都是。您可以编写一个将这两个容器包装在一起的类,这样您就不能修改一个容器而不修改另一个容器,或者您可以确保永远不会犯错误。

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