【问题标题】:data structure for accessing sorted subsets of a set c++用于访问集合 C++ 的已排序子集的数据结构
【发布时间】:2014-02-14 18:36:47
【问题描述】:

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

在这里使用的正确数据结构和过程是什么?我已经为此苦苦挣扎了一段时间,因此不胜感激。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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

    【讨论】:

    • 感谢您的回复,但我对您的符号和我的符号之间的映射有点困惑。您的 SomeKey 是否对应于我的索引或值?因为如果它们是索引,那么它们是按索引而不是值排序的,如果它们是值V[i],那么对象是什么(SomeObjects)?但是让我们说,而不是map,我们使用包含值setV——正如你所建议的那样。在这种情况下,索引会发生什么?
    • @Siamak 索引是由 indexedObjects[index] 为您提供对象的迭代器这一事实所暗示的。至于您对SomeKey 的困惑,请查看std:map。不,它不是你的索引——它是你希望你的对象排序的属性。
    • 因为我是按值排序的.但这不允许我以排序顺序迭代值的子集(由 indexedObject 的子集索引)。正确的?即使迭代 set 的值,我也无法使用 indexedObject(因为我可以迭代 set 本身)。
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多