【发布时间】:2018-05-05 16:57:43
【问题描述】:
我很难掌握应该如何使用std::nth_element,因为我有点生疏了。
裁判说:
重新排列
[first,last)范围内的元素,使第n 个位置的元素成为排序序列中该位置的元素。
我想获取向量子集的第 n 个元素,所以我想这样做:
std::nth_element (v.begin()+start-0, v.begin()+nTh-1, v.begin()+end);
意思是取向量v 的子集,从start 直到end(不包括),然后假设这个子集已排序,定位nTh 元素。
似乎我的理解是错误的,因为这个玩具示例:
#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;
}
打印 9 作为请求的元素,而我期待 5。请问我错过了什么?
【问题讨论】:
-
cplusplus.com 上的例子不是很简洁,使用Cppreference
-
根据我目前的经验,cppreference 通常是更好的参考。
-
@Rakete1111 和 WhiZTim,感谢您的提示! Baum mit Augen,它是学术性的,但对简单的事情没有那么友好和直接(但似乎我付出了这个代价)。
-
如果您甚至无法确定
random_shuffle之后的值5是否在您的 @987654333 涵盖的子范围内,您怎么可能“期望 5”(或任何其他特定值) @呼叫? -
@gsamaras 我的回答是否遗漏了一些愚蠢的东西?我其实很困惑atm。
标签: c++ algorithm vector nth-element