Имя STL для функции функционального программирования «карта»

Я хотел бы написать что-то вроде

char f(char);
vector<char> bar;
vector<char> foo = map(f, bar);

Функция преобразования выглядит аналогично, но не будет автогенерация размера результирующей коллекции.

31
задан TrebledJ 18 May 2019 в 05:02
поделиться

1 ответ

Чтобы это работало, вам потребуются следующие наблюдения:

  1. Чтобы сделать назначение эффективным, функция map должна не делать работа.Вместо этого он должен сохранять свои аргументы во временном объекте (в вашем случае это будет экземпляр class map::result >)
  2. . ]Этот временный map::result должен иметь преобразование template operator T.
  3. Когда map::result присваивается std::vector, это преобразование является единственно возможным.
  4. В операторе преобразования class map::result >::operator vector у вас есть тип ввода и возврата, а также отображение функция. На этом этапе вы можете эффективно преобразовать входные данные.

Код

template<typename CONT, typename FUNC>
class mapresult {
    CONT const& in;
    FUNC f;
public:
    template<typename RESULT> RESULT to() const
    {
        RESULT out;
        for (auto const& e : in) { out.push_back(f(e)); }
        return out;
    }
    template<typename RESULT> operator RESULT() const
    {
        return this->to<RESULT>();
    }
    mapresult(CONT const& in, FUNC f) : in(in), f(std::move(f)) { }
};

template<typename CONT, typename FUNC>
auto map(CONT const& in, FUNC f) -> mapresult<CONT, FUNC>
{
    return mapresult<CONT, FUNC>(in, f);
}

Используйте так:

using namespace std;
char foo(char c) { return c | ('A' ^ 'a'); }
std::string in = "Test";

int main(int argc, char* argv[])
{
    string out = map(in, &foo);
    cout << out << endl;

    char replace = 'e';
    cout << map(in, [replace](char c){return c == replace ? '?' : c; }).to<string>();
}
2
ответ дан 27 November 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: