复制 obj 类向量中的所有项目。最小值和最大值之间(按字段)到另一个向量,然后删除它们

问题描述 投票:0回答:1

所以我是 cpp 的新手,我有一个程序可以查找类对象向量中的最小值和最大值(按字段),我需要将它们之间的所有项目移动到另一个向量中,然后从原始向量中删除它们向量。我无法理解它,如何使用迭代器迭代向量并检查条件(it > minVal && it < maxVal).

这是我写的课程:

class Ball {
private:
    int size;
    std::string color;

public:
    Ball() :size(0), color("") {};
    Ball(int size, std::string color) : size(size), color(color) {}
    int get_size() { return size; }
    std::string get_color() { return color; }

    //перегрузка операторів для зручності роботи 
    bool operator<(const Ball& other) { return size < other.size; }  
    bool operator>(const Ball& other) { return size > other.size; }  
    friend std::ostream& operator<<(std::ostream& os, const Ball& ball) { //дружня ф-ція перегрузки оператора "<<" для виводу всіх полів
        os <<  ball.size << "\\" << ball.color;
        return os;
    }
};

我有一个输出两个类对象的函数:minBall 和 maxBall(按大小字段)。 我尝试使用 std::find_if() 并为其编写了一个基本比较器:

bool comparator_for_ext(Ball& a, Ball& minBall, Ball& maxBall) {
    return a < maxBall || a > minBall;
}

我如何将什么作为“a”传递给 compatator_for_ext()

 std::find_if(balls.begin(), balls.end(), comparator_for_ext(what to pass here, minBall, maxBall))

c++ vector
1个回答
0
投票

find_if 接受一元 谓词(比较器)。请注意,您将谓词本身传递给 find_if,而不是调用它。实现此目的的一种方法是创建一个新函数,该函数将使用所需的值调用 comparator_for_ext。

auto ball_it = std::find_if(balls.begin(), balls.end(), [=](const Ball& a){ return comparator_for_ext(a, minBall, maxBall); });

另一种方法是定义一个 callable 类,您可以使用 minBall 和 maxBall 值构造该类,并将其作为谓词传递给 find_if

class BallInRange {
private:
    const Ball& minBall;
    const Ball& maxBall;
public:
    BallInRange(const Ball& min, const Ball& max) : minBall(min), maxBall(max) {}

    bool operator()(const Ball& a) const {
        return a < maxBall && a > minBall;
    }
};

那么对 find_if 的调用将如下所示

BallInRange ball_predicate(minBall,maxBall);
auto ball_it = std::find_if(balls.begin(), balls.end(), ball_predicate);

不相关 - comparator_for_ext 正如您所写,它对于每个球都会评估为 true。

© www.soinside.com 2019 - 2024. All rights reserved.