c++ - std::multiset,跟踪插入的元素位置

标签 c++ data-structures selection multiset

我可以以某种方式重载 std::multiset 的任何运算符(就像使用“()”创建自定义 comapre 函数一样),这样当多重集中的 2 个元素被交换时,来自另一个链接 vector 的另外 2 个元素也会被交换到那些?

我的意思是,我实际上想在多重集中插入​​ elemetns {a,b,c,d,e} ,但我也想跟踪它们在多重集中的位置,而不必使用 .find( )。于是我想到创建另一个 vector pos,其中pos[k]是元素k在多重集中的位置。

所以,如果我有这个 vector pos,当我在其中插入一个元素时,我仍然必须创建多重集,不仅要把它放在多重集中的正确位置,而且还要更改所有交换元素的 pos[] .

我不完全知道多重集如何更改/交换它的元素来对它们进行排序,但我可以以某种方式覆盖它,而不是:

swap(a,b);

我要一些类似的东西。

swap(pos[a],pos[b]);
swap(a,b)

如果您对如何在不使用 .find() (相同元素的复杂度为 O(N) )的情况下跟踪多重集中元素的位置有任何其他想法,那就太棒了!

编辑

而且,我想我必须更改一些内容,以便当我插入新元素 (n) 时,它会在任何“交换”之前获得 pos[n] 的正确初始化制作。

最佳答案

作为替代方案,您可能需要查看 order statistic tree 数据结构,具有以下功能,全部在 O(log n) 时间内工作:

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

换句话说,您可以按位置或键向树询问元素,并且可以让树告诉您给定元素所在的位置。它还按排序顺序存储元素(如 std::multiset),并且可以轻松处理重复元素。简而言之,它可以像 std::multiset 一样使用,有效支持索引。

这看起来可能是最好的方法,但不幸的是顺序统计树不在 C++ 标准库中。您需要为它们找到一个第三方库。

希望这有帮助!

关于c++ - std::multiset,跟踪插入的元素位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9267599/

相关文章:

c++ - C++中的反射。 C++中如何将函数作为参数传递

c - 链表节点内存分配

java - 破解 : Duplicates in java. util.TreeSet?

html - 选择元素时如何更改选择元素的背景颜色?

c++ - 带有参数列表的父类(super class)方法 <superclass> 与专用列表一起使用

c++ - 既然我有 msys2,我可以删除之前在 mingw 上安装的实例吗?

c++ - 为什么 google test sample 将测试放在匿名命名空间中?

java - 当构造函数具有类的类型时,这意味着什么?

android - 在android中以编程方式获取选择句柄

wpf - TreeView 项 : How to make selection change occur on Click instead of MouseDown?