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

我试图使用std::min_elementstd::max_element来返回双精度vector中的最小和最大元素。 我的编译器不喜欢我目前正在尝试使用它们,我不明白错误消息。 我当然可以写我自己的程序来find最小/最大值,但我想了解如何使用这些函数。

 #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 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 

请有人解释我做错了什么?

min_elementmax_element返回迭代器,而不是值。 所以你需要*min_element...*max_element...

正如其他人所说, 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 

注意:

对于大数据集,使用上面注释中build议的std::minmax_element()可能会更快,但可能会给出稍微不同的结果。 我上面的例子的将是相同的,但“max”元素的位置将为9因为…

如果几个元素相当于最大元素,则返回最后一个元素的迭代器。

min / max_element将迭代器返回到最小/最大元素,而不是最小/最大元素的值。 你必须取消引用迭代器才能获取值并将其分配给double。 那是:

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