如何使用std :: max_element在b向量中找到最大值?

时间:2019-04-15 10:54:10

标签: c++

class Stats {
private:
    int a = 0;
    int b = 0;
    int c = 0;
public:
    Stats(int A = 0, int B = 0, int C = 0) : a(A), b(B), c(C) {}
};

int main()
{
    int a = 0; int b = 0; int c = 0;
    std::vector<Stats> example;
    for (int b = 0; b < 10; b++)
    {
        a++;
        b += 5;
        c += 3;
        example.emplace_back(a, b, c);
    }
}

1 个答案:

答案 0 :(得分:0)

正如各种评论所表明的那样,您的问题在各个方面都处于黑暗中,因此很难回答您的问题。我尝试使用以下假设和更改进行尝试:

  • 更改:由于已将Stats成员变量声明为私有,因此无法从外部访问Stats成员变量。但是,很可能需要外部访问,因为您将需要操作员来比较Stats对象。我没有将成员变量声明为公共变量,而是使用前面的下划线将其重命名,并添加了公共(只读)吸气剂a()b()c()

    < / li>
  • 假设:如果A的成员_a + _b + _c的总和小于B的_a + _b + _c的总和,则Stats对象A小于Stats对象B。如果这不符合您的需求,可以将其更改为您所需的任何内容。

  • 更改:作为for循环一部分的变量声明“ b”隐藏了外部块的变量声明。此外,如注释中所述,for循环块中的语句b += 5导致循环仅运行两次。因此,我将for循环变量b重命名为x

通过上面的更改/假设,您可以简单地使用std::max_element,方法是使用begin()和end()转发迭代器进行调用。在内部,模板函数使用<运算符比较Stats对象。结果是一个迭代器。调用result - example.begin()用于获取迭代器指向的元素的索引(从0开始)。在给定的示例中,返回9,它是向量的最后一个元素的索引。

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

class Stats {
    private:
        int _a = 0;

        int _b = 0;

        int _c = 0;

    public:
        Stats(int A = 0, int B = 0, int C = 0) : _a(A), _b(B), _c(C) {

        }
        int a() const { return _a; }
        int b() const { return _b; }
        int c() const { return _c; }
};

bool operator< (const Stats& lhs, const Stats& rhs){
    return lhs.a() + lhs.b() + lhs.c() <  rhs.a() + rhs.b() + rhs.c();
}

int main()
{
    int a = 0; int b = 0; int c = 0;
    std::vector<Stats> example;
    for (int x = 0; x < 10; x++)
    {
        a++;
        b += 5;
        c += 3;
        example.emplace_back(Stats(a, b, c));
    }
    std::vector<Stats>::iterator result;
    result = std::max_element(example.begin(), example.end());
    std::cout << "max element at: " << result - example.begin() << '\n';
}