【问题标题】:How to find the value stored in a particular index of a multiset in C++? [closed]如何在 C++ 中查找存储在多重集的特定索引中的值? [关闭]
【发布时间】:2017-10-28 09:13:52
【问题描述】:

假设我有一个多重集 {1,3,5,7,9}。我想使用 C++ 找到这个多重集中的第三个元素是什么。不使用循环如何做到这一点?

【问题讨论】:

  • *(++ ++ms.begin())
  • 如果您需要对容器进行索引访问,std::multiset 可能是容器类型的错误选择。 std::vectorstd::deque 提供恒定时间索引访问。
  • 我投票决定将此问题作为题外话结束,因为“gimme teh codez”

标签: c++ stl


【解决方案1】:

这个应该指向数组的第二个元素

int a[] = {1,3,5,7,9}; int *p = a; std::cout

【讨论】:

  • 但我想为任何索引工作。
【解决方案2】:

多重集通常以树的形式实现,因此您必须逐个节点遍历它以按顺序找到特定节点。换句话说,无论你如何表达它(循环或其他方式),它都需要 N 次操作才能到达树中的第 Nth 项。

如果您的兴趣纯粹是为了避免编写循环,您可以...通过使用以下内容来掩饰它:

auto p = mySet.begin();
std::advance(p, 2);

...但这只会隐藏advance 内部的循环,并不能真正消除它。 std::next 也可以完成这项工作,但(再次)只是隐藏了循环,并没有消除它。

虽然std::set/std::multiset 没有提供它,但如果你需要做很多,有一个专门的树变体支持在 O( log N) 时间(具有 O(N) 空间开销)。

与通常在树中的数据一起,在每个节点中,您存储该节点的子树中的元素数量。您首先通过从其自身大小中减去其左子树的大小来查找根的索引。如果您要查找的索引大于该索引,则向右下降。如果小于,则向左下降(如果相等,则找到要查找的节点)。

当您下降时,您需要不断计算您的位置。您已经计算出根的索引,因此将其保留在运行计数中。然后,当您下降到一个节点时,如果您向右下降,则添加新节点左子树的 1 + 大小。如果向左下降,则减去 1 + 右子树的大小。

为了保持计数,当您在插入时通过一个节点下降时,您会增加它的计数(当您删除时,您会减少它的计数 - 但只有在验证要删除的值存在之后) .

如果您想搜索更多详细信息,这通常称为“订单统计树”。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
相关资源
最近更新 更多