Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+中查找存储在多集的特定索引中的值+;?_C++_Stl - Fatal编程技术网

C++ 如何在C+中查找存储在多集的特定索引中的值+;?

C++ 如何在C+中查找存储在多集的特定索引中的值+;?,c++,stl,C++,Stl,假设我有一个多集{1,3,5,7,9}。我想用C++来找出这个多集中的第三个元素。如果不使用循环,我怎么做呢?这个应该指向数组的第2个元素 int a[]={1,3,5,7,9};int*p=a;std::cout一个多集通常被实现为一棵树,因此您必须逐节点遍历它以按顺序找到一个特定的节点。换句话说,无论您如何表达它(循环或其他),都需要N次操作才能到达树中的第N项 如果您的兴趣纯粹是为了避免编写循环,那么您可以…使用以下方法来掩饰它: auto p = mySet.begin(); std::

假设我有一个多集{1,3,5,7,9}。我想用C++来找出这个多集中的第三个元素。如果不使用循环,我怎么做呢?

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


int a[]={1,3,5,7,9};int*p=a;std::cout一个多集通常被实现为一棵树,因此您必须逐节点遍历它以按顺序找到一个特定的节点。换句话说,无论您如何表达它(循环或其他),都需要N次操作才能到达树中的第N项

如果您的兴趣纯粹是为了避免编写循环,那么您可以…使用以下方法来掩饰它:

auto p = mySet.begin();
std::advance(p, 2);
…但这只会将循环隐藏在
advance
内部,而不会真正消除它<代码>标准::下一步也将完成这项工作,但(再次)只是隐藏循环,并没有消除它

虽然
std::set
/
std::multiset
不提供它,但是如果您需要经常这样做,有一种特殊的树变体,它支持在O(logn)时间内查找第N个元素(有O(N)空间开销)

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

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

为了保持计数,当您在任何时候通过节点插入时,您都会增加其计数(当您删除时,您会减少其计数——但只有在验证要删除的值是否存在之后)


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

但我想使用任何索引。感谢您的帮助。
*(++++ms.begin())
如果您需要对容器进行索引访问,则对于容器类型,
std::multiset
可能是错误的选择
std::vector
std::deque
提供固定时间索引访问。我投票结束这个问题,因为“给我一个codez”