如何基于属性从向量中提取最大的对象?

6

假设我有一堆Donut对象,每个甜甜圈都有一个公共整数属性diameter。如果我有一组甜甜圈的向量,如何提取直径最小或最大的甜甜圈?

3个回答

18

您可以使用 std::min_elementstd::max_element。例如,给定一个 std::vector<int>

std::vector<int> v;
std::vector<int>::iterator it = std::max_element(v.begin(), v.end());
// 'it' points to the largest element in 'v'

如果你想使用除了默认的 operator< 以外的方式来比较元素,你需要编写一个自定义比较器:

bool compare_donut_diameters(const Donut& x, const Donut& y)
{
    return x.diameter < y.diameter;
}

用途:

std::vector<Donut> v;
std::vector<Donut>::iterator it = std::max_element(v.begin, v.end(), 
                                                   compare_donut_diameters);

您还可以使用函数对象(也称为函数符)来实现比较器,或者如果您的编译器支持lambda表达式,则可以使用lambda:

auto it = std::max_element(v.begin(), v.end(), 
    [](const Donut& x, const Donut& y) {  return x.diameter < y.diameter; });

3
没错,学会在80列中使用lambda函数肯定需要一些时间。;-) - Steve Jessop
2
@Steve:说真的!我觉得我已经重新格式化了上一个示例四次了……幸好宽屏显示器更为普及。240个字符的行,我来了! - James McNellis
c++0x 看起来很陌生... "auto",匿名函数... 哼 :-) - bjoernz

1
你可以使用 std::min_element:
// You can use a functor instead!
bool compare_donut(const Donut& lhs, const Donut& rhs)
{ return lhs.diameter < rhs.diameter; }
...
// min_donut is an iterator to the smallest donut in donut_vector.
std::vector<Donut>::iterator min_donut = 
   std::min_element(donut_vector.begin(), donut_vector.end(), compare_donut);

如果你想得到最大值,可以使用带有相同比较器的 std::max_element

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接