Можно использовать алгоритмы двоичного поиска STL (binary_search, upper_bound, lower_bound) для поиска вектора базовых указателей для производного объекта, как показано ниже. Поскольку Base является абстрактным (защищенный конструктор), необходимо создать экземпляр производного объекта для функций поиска, что немного некрасиво.
Я хочу найти вектор для первого производного выше в заданное время. Могу ли я сделать это без произвольного выбора и создания экземпляра одного из многих унаследованных классов?
#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