我可以以某种方式重载 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/