2

从给定的未排序向量中,我想获得第 n 个最小的元素。我发现标准库中有一个方法。但我不明白以下结果。

我用条目 {3,4,5,2,3} 取向量,并希望有第二个最小的元素。如果我执行下面的代码,我会在第二个位置得到数字 2,实际上它应该是 3。因为 2 是第一个最小的元素,而不是第二个。

我的错误是什么?

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

int main()
{
  std::vector<size_t> temp;
  temp.assign({3,4,5,2,3});
  std::nth_element (temp.begin(), temp.begin()+2, temp.end());
  std::cout << std::endl;
  for(size_t i=0;i<temp.size();i++){ printf("%.2f\n",(double)temp[i]);  }
}
4

2 回答 2

5

temp.begin()+2给你向量的第三个元素,而不是第二个。第一个元素是temp.begin()(ie temp.begin() + 0),第二个元素是temp.begin() + 1。所以你想这样做:

std::nth_element (temp.begin(), temp.begin()+1, temp.end());
于 2015-06-07T17:57:45.063 回答
2

如果你想获得第二小的元素,那么你必须使用迭代器

temp.begin() + 1

或者可以写成

std::next( temp.begin() )

这是一个演示程序

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

int main()
{
    std::vector<size_t> v = { 3, 4, 5, 2, 3 };

    std::nth_element( v.begin(), std::next( v.begin() ), v.end() );

    for ( int x : v ) std::cout << x << ' ';
    std::cout << std::endl;
}

程序输出为

2 3 4 3 5

正如您在第二个位置看到的,第二个最小的元素是 3。

在我看来,这不是一个好方法,因为它改变了向量中元素的顺序。通常你不能改变底层容器的元素顺序。

于 2015-06-07T18:06:14.597 回答