查找向量的 max_element,其中的成员用于确定其是否为最大值

发布于 2024-09-28 13:54:17 字数 405 浏览 4 评论 0原文

考虑一个具有成员 x 和 std::vector< 的类 A。 A>.现在,在向量内的所有元素中搜索最大 x 是一个常见的任务。显然,如果 x 上有迭代器,我只能使用 std::max_element 。但我必须自己写一个,或者我只是做一个简单的for循环。

maxSoFar = -std::numeric_limits< double >::max();
for( std::vector< A >::const_iterator cit = as.begin(); cit != as.end(); ++cit )
{
  if( cit->x > maxSoFar )
    maxSoFar = cit->x;
}

但这太乏味了,而且我太懒了..有更好的选择吗?

Consider a class A having a member x and a std::vector< A >. Now its a common task to search for the maximal x among all elements inside the vector. Clearly I can only use std::max_element if there is an iterator on the x's. But I must write one by my own, or I just make a simple for loop.

maxSoFar = -std::numeric_limits< double >::max();
for( std::vector< A >::const_iterator cit = as.begin(); cit != as.end(); ++cit )
{
  if( cit->x > maxSoFar )
    maxSoFar = cit->x;
}

but it's so tedious, and I am so lazy.. Is there a better option?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

子栖 2024-10-05 13:54:17

您可以将比较器传递给 max_element。如果你的编译器支持 lambda(可能确实如此),这很简单:

std::max_element(as.begin(), as.end(),
    [](A a, A b){ return a.x < b.x; });

You can pass a comparator to max_element. And if your compiler supports lambdas(it probably does), this is easy:

std::max_element(as.begin(), as.end(),
    [](A a, A b){ return a.x < b.x; });
并安 2024-10-05 13:54:17

如果您可以使用 boost,那么您可以为 max_element 所需的二元谓词编写 lambda 表达式:

struct A
{
    A(int n): x(n)
    {
    }
    int x;
};

using namespace std;
using namespace boost::lambda;

int main()
{
    vector<A> as;
    as.push_back(A(7));
    as.push_back(A(5));
    as.push_back(A(3));

    vector<A>::iterator iter = max_element(as.begin(), as.end(), bind(&A::x, _2) > bind(&A::x, _1));
    int max = iter->x;
}

If you can use boost then you can write a lambda expression for the binary predicate expected by max_element:

struct A
{
    A(int n): x(n)
    {
    }
    int x;
};

using namespace std;
using namespace boost::lambda;

int main()
{
    vector<A> as;
    as.push_back(A(7));
    as.push_back(A(5));
    as.push_back(A(3));

    vector<A>::iterator iter = max_element(as.begin(), as.end(), bind(&A::x, _2) > bind(&A::x, _1));
    int max = iter->x;
}
月棠 2024-10-05 13:54:17

1)将第一行更改为:

maxSoFar = *(as.begin());

2)实现自定义比较器,并使用 max_element (根据需要):
http://www.cplusplus.com/reference/algorithm/max_element/

1) Change the 1st line to this :

maxSoFar = *(as.begin());

2) Implement a custom comparator, and use max_element (as you wanted) :
http://www.cplusplus.com/reference/algorithm/max_element/

旧伤慢歌 2024-10-05 13:54:17

在你的类中实现operator<,调用:

maxSoFar =  *(std::max_element(as.begin(), as.end()));

Implement operator< in your class, the call:

maxSoFar =  *(std::max_element(as.begin(), as.end()));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文