带有向量和 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;
}
如果有帮助请告诉我!
为了作业的目的,学习了函数指针和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;
}
如果有帮助请告诉我!