在向量 < double > 上使用 std: : max_element

我尝试使用 std::min_elementstd::max_element来返回双精度向量中的最小和最大元素。我的编译器不喜欢我当前尝试使用它们的方式,而且我不理解错误消息。当然,我可以编写自己的过程来求最小值和最大值,但是我想了解如何使用这些函数。

#include <vector>
#include <algorithm>


using namespace std;


int main(int argc, char** argv) {


double cLower, cUpper;
vector<double> C;


// Code to insert values in C is not shown here


cLower = min_element(C.begin(), C.end());
cUpper = max_element(C.begin(), C.end());


return 0;
}

下面是编译器错误:

../MIXD.cpp:84: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment
../MIXD.cpp:85: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment

我做错了什么?

118183 次浏览

min_elementmax_element返回迭代器,而不是值。因此需要 *min_element...*max_element...

Min/max _ element 将 迭代器返回给 min/max 元素,而不是 min/max 元素的值。您必须取消对迭代器的引用,以便取出值并将其分配给 double。那就是:

cLower = *min_element(C.begin(), C.end());

正如其他人所说,强 > std::max_element() std::min_element() 返回 迭代器,它们需要成为 解除引用才能获得 价值

返回迭代器(而不仅仅是值)的好处是,它允许您用最大(或最小)值确定容器中(第一个)元素的 位置

例如(使用 C + + 11表示简洁) :

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


int main()
{
std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};


auto biggest = std::max_element(std::begin(v), std::end(v));
std::cout << "Max element is " << *biggest
<< " at position " << std::distance(std::begin(v), biggest) << std::endl;


auto smallest = std::min_element(std::begin(v), std::end(v));
std::cout << "min element is " << *smallest
<< " at position " << std::distance(std::begin(v), smallest) << std::endl;
}

结果是:

Max element is 5 at position 4
min element is 1 at position 0

注:

对于大型数据集,按照上面的注释中的建议使用 强 > std::minmax_element()可能会更快,但结果可能略有不同。上面例子中的 价值观应该是相同的,但是“ max”元素的位置应该是 9,因为..。

如果多个元素等效于最大的元素,则返回最后一个这样的元素的迭代器。