Алгоритмы возвращающие наборы, или...
От: Мёртвый Даун Россия  
Дата: 07.06.18 02:33
Оценка:
Вопрос сугубо практический...

Есть типа такого:

// интерфейс
class A
{
public:
    A();
    virtual ~A() = 0;

    int GetValueA();
    char* GetValueB();
};

// используется полиморфно
class B: public A
{
public:
    ~B() {}
    int GetValueA();
    char* GetValueB();
    long GetValueC();
    ... // тут еще может быть стопицот геттеров
};

// всё это в каком то контейнере, для простоты пусть std::vector<A*>.

std::vector<A*> vecA; // здесь данные всегда живы, не удаляются, не изменяются...


Хочется функцию, которая будет обращаться к этому контейнеру, и на основании значений возвращаемых геттерами объектов класса B, чтото возвращала. Но что? Набор? Новый std::vector? Range?
Посмотрел в сторону алгоритмов возвращающие наборы, типа std::copy_if.

int Func(const std::vector<A*>& in, std::vector<A*>& out)
{
    out.resize(in.size());
    auto it = std::copy_if(in.begin(), in.end(), out.begin(), [&](A* b) -> bool
    {
        if (b.GetValueA()) return true;
        if (b.GetValueB()) return false;
        // и т.д., на основании значений геттеров принимаем решение, копировать или нет
    });
    out.resize(std::distance(out.begin(), it));
}


И так делаем часто, выборку из контейнера по каким то условиям на основании значений геттеров.

Кажется както не эффективно, особенно постоянное копирование.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.