Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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++ 关于n_元素的理解_C++_Algorithm_Vector_Nth Element - Fatal编程技术网

C++ 关于n_元素的理解

C++ 关于n_元素的理解,c++,algorithm,vector,nth-element,C++,Algorithm,Vector,Nth Element,由于我有点生疏,我很难掌握我应该如何使用 裁判说: 重新排列范围[第一,最后)中的元素,使第n个位置的元素是按排序顺序位于该位置的元素 我想取向量子集的第n个元素,所以我想这样做: std::nth_element (v.begin()+start-0, v.begin()+nTh-1, v.begin()+end); 这意味着从开始,直到结束(独占),取向量v的子集,然后假设该子集已排序,定位n元素 似乎我的理解是错误的,因为这个玩具示例: #include <iostream>

由于我有点生疏,我很难掌握我应该如何使用

裁判说:

重新排列范围
[第一,最后)
中的元素,使第n个位置的元素是按排序顺序位于该位置的元素

我想取向量子集的第n个元素,所以我想这样做:

std::nth_element (v.begin()+start-0, v.begin()+nTh-1, v.begin()+end);
这意味着从
开始
,直到
结束
(独占),取向量
v
的子集,然后假设该子集已排序,定位
n
元素

似乎我的理解是错误的,因为这个玩具示例:

#include <iostream>
#include <algorithm>
#include <vector>

int main () {
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<10; i++) myvector.push_back(i);   // 1 2 3 4 5 6 7 8 9

  std::random_shuffle (myvector.begin(), myvector.end());


  std::nth_element (myvector.begin() + 1 - 0, myvector.begin()+5-1, myvector.begin() + 5);
  std::cout <<  *(myvector.begin()+5-1) << std::endl;

  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}
#包括
#包括
#包括
int main(){
std::vector myvector;
//设置一些值:
对于(int i=1;i尝试:

而不是:

std::nth_element (myvector.begin() + 1, 
                  myvector.begin() + 4, 
                  myvector.begin() + 5);
您正在洗牌,然后仅为一个子序列调用
n\u元素
。这样您就无法确定返回的元素应该是什么。如果对整个序列执行此操作,则答案是5

我想取向量子集的第n个元素,所以我想 这样做:

std::nth_element (v.begin()+start-0, v.begin()+nTh-1, v.begin()+end);
std::n_元素(v.begin()+start-0,v.begin()+n-1,v.begin()+end)

意味着取向量v的子集,从开始到结束 结尾(独占),然后想象这个子集被排序, 定位第n个元素

是的,那是真的。 但这样做时,位置v[0]到v[start-1]和v[end]到v[v.size()-1]中的任何元素都不会是第n个元素重新排列的一部分,它们将留在原来的位置。作为第n个元素()的一部分,您的开始和结束已将这些元素排除在重新排列之外

我想你想要

std::nth_element (myvector.begin(), myvector.begin()+ 4, myvector.end());
考虑整个向量(第n个元素的第一个和第三个参数)

这意味着不管random_shuffle在哪里洗牌元素

std::random_shuffle (myvector.begin(), myvector.end());

因为n_元素考虑的是整个向量,所以n_元素的第二个参数,即myvector中的第五个项目(如果已排序),应该是5。注意,由于n_元素的工作方式,前面的项目将小于5(并且以任何顺序),接下来的项目将大于5(并且以任何顺序).

cplusplus.com上的例子并不十分简洁,以我目前的经验来看,cppreference通常是更好的参考。@raket1111和WhiZTim,谢谢你的提示!Baum mit Augen,它是学术性的,但对于简单的事情却没有那么友好和直接(但似乎我为此付出了代价)。你怎么可能“期望5”(或任何其他特定值),如果你甚至不能确定在
random\u shuffle
之后
value
5
是否在
nth\u元素
调用所覆盖的子范围内?@gsamaras我的答案是否遗漏了一些愚蠢的东西?我实际上非常困惑atm。这不是一个答案。@PeteBecker我指出他使用的例子有一个错误。这解决了问题整个问题,因为
n元素
按他预期的方式工作。这怎么不是答案呢?@PeteBecker这很有趣,因为编辑后的版本实际上是我在编辑之前发布的原始版本。是的,我也很困惑。而且,这是一个尽可能接近答案的问题,因为它有问题赛尔夫。你用一个刺耳的非答案替换了你原来的答案,这就是我的评论。@PeteBecker,因为我意识到他打算在子序列上调用第n个元素,而不是整个序列。当前的答案很奇怪。不知道为什么回滚…不需要不必要的代码。这没有任何意义。