可以使用STL二进制搜索算法(binary_search,upper_bound,lower_bound)来搜索派生对象的Base指针向量,如下所示 . 由于Base是抽象的(受保护的构造函数),因此必须为搜索函数实例化Derived对象,这有点难看 .
我想在给定时间内搜索第一个Derived的向量 . 我是否可以在不随意挑选和实例化我的许多继承类之一的情况下执行此操作?
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
class Base {
protected:
Base(double t, int d) : data(d), time(t) {}
public:
double time;
int data;
virtual void print() {
printf("Base: data = %d, time = %.1f\n",data,time);
}
};
class Derived : public Base {
public:
Derived(double t, int d) : Base(t,d) {}
virtual void print() {
printf("Derived: data=%d, time=%.1f\n",data,time);
}
};
struct BaseTimeComp {
bool operator()(Base* a, Base* b) { return a->time < b->time; }
};
int main()
{
vector<Base*> v;
for(int i=0; i<5; i++) { v.push_back(new Derived(i+0.4,i)); }
Base* pLow = *(lower_bound(v.begin(),v.end(),
new Derived(3.5,0), //NOT "new Base(3.5,0)"
BaseTimeComp()));
printf("lower bound for time=3.5:\n");
pLow->print();
}
程序打印:时间下限= 3.5:派生:数据= 4,时间= 4.4
3 回答
比较的目标不必与容器的内容类型相同,只需要与容器进行比较即可:
你假设你必须做某种
Base
是错误的 . 只要您的显式(或隐含)比较运算符知道该怎么做,您就可以定义适合您比较的BaseKey
.下面的评论也是错误的,因为这个更复杂的例子表明:
您还可以显式使用比较类型(这有助于操作顺序问题,例如您可能会找到
upper_bound
):一个
binary_search
示例提供了与多态性的比较:您可以传递一个空指针,并设计您的比较函数忽略它,并仅测试另一个对象的特定属性 .
在某种程度上,您可以使用静态方法:
并在对LowerBound的调用中:
这意味着您不必了解任何派生类,但是获取Base类的实例会首先破坏Base的抽象目的 . 你也可以将构造函数公开 .