所以我是 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))
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。