我可以以某种方式重载任何std :: multiset的运算符(就像你用'()'来创建一个自定义的comapre函数),这样当多重集合中的2个元素被交换时,另一个链接的另外2个元素也是如此那些?
我的意思是,我实际上想在multiset中插入让我们说elemetns {a,b,c,d,e},但我也想跟踪它们在multiset中的位置,而不必使用.find( )。所以我考虑创建另一个向量pos,其中pos [k]是多重集中元素k的位置。
所以,如果我有这个向量pos,我仍然必须在我插入一个元素时制作multiset,不仅要将它放在multiset中的正确位置,而且还要更改所有元素交换的pos []
我不知道multiset如何更改/交换它的元素以对它们进行排序,但是我可以以某种方式覆盖它而不是:
swap(a,b);
我会有类似的东西。
swap(pos[a],pos[b]);
swap(a,b)
如果你有任何其他的想法,我怎么能跟踪一个元素在多重集中的位置,而不使用.find()(对于相等元素具有O(N)复杂度)会很棒!
修改
而且,我想我必须改变一些东西,这样当我插入一个新元素(n)时,它会在pos[n]
之前得到正确的初始化,然后再进行“交换”。
答案 0 :(得分:2)
作为替代方案,您可能需要查看 order statistic tree 数据结构,该结构具有以下功能,所有这些功能都在O(log n)时间内完成:
换句话说,您可以按位置或按键向树询问元素,并且可以让树告诉您给定元素的位置。它还以排序的顺序存储元素(如std::multiset
),并且可以轻松地处理重复的元素。简而言之,它可以像std::multiset
一样有效地支持索引。
这似乎可能是最好的方法,但不幸的是,订单统计树不在C ++标准库中。您需要为他们找到第三方库。
希望这有帮助!
答案 1 :(得分:0)
如果不继承multiset
is not recommended,则无法覆盖这些内容。因此,您需要的是跟踪multiset
中元素位置的逻辑。
如果在multiset
中插入一个元素,则会获得该元素的迭代器。您可以使用它来确定插入元素之前的元素,然后从中确定新位置:
std::multiset<your_item_type> it = your_set.insert(item);
std::size_t new_element_pos = it != your_set.begin() ? pos[*(it--)] + 1
: pos[*(it++)] - 1
重要的是,现在你必须在你插入的项目之后更新项目的所有位置,方法是将它们增加一个。
要跟踪掉期,您可以简单地为您的类型专门设置std::swap
,当交换两个元素时,您可以在位置向量中交换它们的位置。