在向量<double>上使用 std::max_element
Using std::max_element on a vector<double>
我正在尝试使用 std::min_element
和 std::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
我做错了什么?
min_element
和max_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
注意:
对于大型数据集,使用上述注释中建议的std::minmax_element()
可能会更快,但可能会给出略有不同的结果。我上面示例的值是相同的,但"max"元素的位置会9
,因为......
如果多个元素等效于最大的元素,则返回最后一个此类元素的迭代器。
min/max_element 将迭代器返回到 min/max 元素,而不是 min/max 元素的值。您必须取消引用迭代器才能获取值并将其分配给双精度值。那是:
cLower = *min_element(C.begin(), C.end());
相关文章:
- 关于 std::min, std::max 中的比较运算符的混淆
- std::max() 函数与定点实现的比较中的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 在枚举类型上使用std::max是不是一种糟糕的做法
- 如何在 C++11 中将 std::max 与自定义比较器一起使用?
- C++是否在 std::min 和 std::max 下标准化 std::optional 的行为?
- 编译器无法推断 std::max 的重载
- 为什么 c++ 编译器在对两种不同类型的数值变量使用"std::max()"函数时会出现错误
- 执行 std::min(0.0, 1.0) 和 std::max(0.0, 1.0) 会产生未定义的行为
- 自动变量可存储函数指针到std :: max
- std :: max带有动态数组
- std :: max,但用于模板参数
- 如果std::max()通过引用返回(这是必须的),这是否会导致悬空引用
- std::max with lambda and auto
- 在c++11中,如何在向量上调用std::max
- 有没有办法防止开发人员使用std::min, std::max
- 关于std::min()和std::max()的c++可变模板版本的思考
- std::max-需要一个标识符
- 将std::max转换为Java
- 如何在不重载比较操作符的情况下为std::max专门化自定义类型