用于访问集合c++的排序子集的数据结构
data structure for accessing sorted subsets of a set c++
我有一组值V
,由它们的独立项I
访问,即i->V[i]
。我需要根据值V[i]
(例如,从大到小)对这些值进行迭代。此外,我有原始索引I_1, I2,..., I_N
的子集,并且我需要以相同的顺序(从大到小)访问它们的相应值。
这里使用的正确数据结构和过程是什么?我已经为此挣扎了一段时间,所以我们非常感谢您的帮助。
注意,值(V[i]
)是不断更新的,并且访问总是通过索引i
。如果我使用set
来表示值,那么我需要删除更新后的元素,并将其插入回,并提示将其放在哪里(很可能它靠近集合中的前一个位置)。但一个集合只包含V
,不允许我通过i访问元素。另一方面,使用Map
或Multimap
时,元素按I
而不是V
排序。
我似乎需要使用指针和集合等的组合,但我无法解决。。。
你是对的,你需要一个组合。我会这么做:
std::map<SomeKey, SomeObject> sortedObjects;
std::vector<std::map<SomeKey, SomeObject>::iterator> indexedObjects;
插入对象:
indexedObjects.push_back(sortedObjects.emplace(newKey, newObject).first);
这里的想法是,对象实际上是map
中的,但可以通过索引访问的vector
将iterator
s保存到映射中的对象。关键是,除非两个容器都被修改,否则两个容器均不会被修改。您可以编写一个类,将这两个容器包装在一起,这样您就不能在不修改另一个容器的情况下修改其中一个容器,或者您可以确保永远不会犯那个错误。
通过indexedObjects
中的索引和sortedObjects
中的键访问元素。如果需要从中间索引添加/删除元素,请使用list
而不是vector
,这样就可以从容器的中间添加/删除。如果没有单独的密钥,请使用set
,而不是map
。如果有重复的键/对象,请使用multiset
或multimap
。
相关文章:
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 使用选择排序对数组数据结构进行排序,但它不起作用
- 尝试创建排序的动态列表(数据结构)
- 是否有具有对数时间插入、删除和查找(带距离)的排序数据结构
- 在C++中对数据结构进行排序的最快方法
- 用于访问集合c++的排序子集的数据结构
- 哪种数据结构按插入排序并具有快速"contains"检查?
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- C++中的无锁数据结构=只使用原子和内存排序
- 插入最有效的数据结构,然后使用不同的条件进行排序
- 数据结构-选择排序方法
- 排序值C++映射具有多个键值的数据结构
- 用于插入大部分排序数据的数据结构,这些数据将保持排序顺序
- C++ 数据结构的排序算法
- 对一组数字进行排序的最快数据结构(和排序算法)是什么
- "std::"具有排序/排序、存在测试和头/尾访问的数据结构?
- c++数据结构,它根据成员的值自动对对象进行排序
- 排序后的数据结构通过迭代器快速迭代、插入、删除
- 排序列表的最佳数据结构(性能)
- 对数据结构进行排序并保存原始索引的记录