带有向量和 class 的函数指针

function pointer with vector and class

为了作业的目的,学习了函数指针和lambda函数
我创建了一个包含宽度和长度并计算面积的 class Rectangle。 其中一个问题是创建一个 class MyVector ,它是 stl 向量的派生 class 并包含名为 func 的函数,该函数接受一个布尔函数参数,如果 return 为真向量中的至少一个元素是函数的答案,否则,false 将被 returned。(我称这个布尔函数为 cmp)
总的来说,我必须检查是否至少有一个矩形的面积大于 50,如果是,则显示所有矩形。 我不知道如何很好地使用这个指针函数,所以你能通过我的例子帮助我理解这个吗

矩形class:

#pragma once
#include <iostream>
using namespace std;
class Rectangle
{
private:
    int width;
    int length;
public:
    Rectangle(int x, int y) : width(x), length(y) {};
    int area() { width* length; }
    friend ostream& operator<<(ostream& os, const Rectangle& r);
};
ostream& operator<<(ostream& os, const Rectangle& r)
{
    os << r.width << " " << r.length << endl;
    return os;
}

我的向量class:

#include <iostream>
#include <vector>
#include <algorithm>
#include "Rectangle.h"
using namespace std;


template <class T>
class MyVector : public vector<T>
{
public:
    bool func(bool(*cmp)); //This is a function I create, I don't know how to use cmp function to compare area
};
template <class T>
bool MyVector<T>::func(bool(*cmp))
{
    MyVector<T>::iterator it;
    for (it = MyVector.begin(), it < MyVector.end(), it++)
        if (func(*it))
            return true;
    return false;

}
#include <iostream>
#include "Rectangle.h"
#include "MyVector.h"
using namespace std;

int main()
{

        MyVector<Rectangle> Myvec;
        
        Myvec.push_back(Rectangle(2, 4));
        Myvec.push_back(Rectangle(4, 8));
        Myvec.push_back(Rectangle(8, 16));
        Myvec.push_back(Rectangle(16, 32));
        Myvec.push_back(Rectangle(32, 64));
        Myvec.push_back(Rectangle(64, 128));

        if (Myvec.func(/*Here I have to complete*/) 
                //If func function return true print all vector element
            );

    return 0;
}

您需要对 func() 的实现做一些更改:

template <class T>
bool MyVector<T>::func(bool(*cmp)(const T&))
{
    typename MyVector<T>::iterator it;
    for (it = this->begin(); it < this->end(); it++)
        if (cmp(*it))
            return true;
    return false;

}

你所拥有的和现在的主要区别是:

  • 传入的函数指针将接受const T&
  • 类型的单个参数
  • 迭代发生在 this->begin()this->end() 之间(你在那里的东西不会被编译)
  • 使用cmp(*it)代替func(*it)

然后你可以在主函数中实际使用它,如:

bool larger_than_50_area(const Rectangle& r) {
    return r.area() > 50;
}

int main()
{
    MyVector<Rectangle> Myvec;
    ...

    if (Myvec.func(larger_than_50_area)) {
        ...
    }
    return 0;
}

如果有帮助请告诉我!