Std :: multiset,跟踪插入元素的位置

时间:2012-02-13 20:33:58

标签: c++ data-structures selection multiset

我可以以某种方式重载任何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]之前得到正确的初始化,然后再进行“交换”。

2 个答案:

答案 0 :(得分:2)

作为替代方案,您可能需要查看 order statistic tree 数据结构,该结构具有以下功能,所有这些功能都在O(log n)时间内完成:

  • 插入
  • 删除
  • 寻找继任者
  • 查找前身
  • 按键查找
  • 按索引查找
  • 告诉元素的索引(在O(1)中,如果你已经有一个迭代器)

换句话说,您可以按位置或按键向树询问元素,并且可以让树告诉您给定元素的位置。它还以排序的顺序存储元素(如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,当交换两个元素时,您可以在位置向量中交换它们的位置。