std::nth_element 提供了错误的值
std::nth_element provides wrong value
我想从给定的未排序向量中获取第 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]); }
}
temp.begin()+2
给出向量的第三个元素,而不是第二个。第一个元素是temp.begin()
(即temp.begin() + 0
),第二个元素是temp.begin() + 1
。所以你想这样做:
std::nth_element (temp.begin(), temp.begin()+1, temp.end());
如果你想获得第二小的元素,那么你必须使用迭代器
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。
我认为这不是一个好的方法,因为它改变了向量中元素的顺序。通常你可以不改变底层容器的元素顺序。
我想从给定的未排序向量中获取第 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]); }
}
temp.begin()+2
给出向量的第三个元素,而不是第二个。第一个元素是temp.begin()
(即temp.begin() + 0
),第二个元素是temp.begin() + 1
。所以你想这样做:
std::nth_element (temp.begin(), temp.begin()+1, temp.end());
如果你想获得第二小的元素,那么你必须使用迭代器
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。
我认为这不是一个好的方法,因为它改变了向量中元素的顺序。通常你可以不改变底层容器的元素顺序。