我有一组值V
,可以通过I
来访问i->V[i]
。
我需要根据值V[i]
迭代这些(例如从大到小)。
此外,我有原始indecies I_1, I2,..., I_N
的子集,我需要以相同的顺序(从大到小)访问它们的相应值。
这里使用的数据结构和程序是什么?我已经在这方面苦苦挣扎了一段时间,所以感谢任何帮助。
请注意,值(V[i]
)会不断更新,并始终通过索引i
进行访问。
如果我使用a set
来表示值,那么我需要删除更新的元素并将其插入,并将提示放在哪里放置它(很可能它接近它在集合中的先前位置) 。但是一个集合只包含V
,并且不允许我通过i访问元素。另一方面,使用Map
或Multimap
元素按I
而不是V
排序。
似乎我需要使用指针和套装等的组合,但我无法弄清楚......
答案 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}}。