Как использовать последние N элементов вектора в качестве параметров функции в C ++? - PullRequest
0 голосов
/ 12 февраля 2019

Я давно читаю этот сайт, но только что зарегистрировался.Я также использовал поиск, который, казалось, не очень помог.

Вот оно: Поскольку я получаю удовольствие от C ++, я натолкнулся на концепцию «ленивой оценки» в Интернете.Я заинтересован в создании чего-то вроде «ленивого вектора», который определяется с помощью функции, которая принимает N аргументов и первые N векторных элементов.

Однако в настоящее время я столкнулся с этой проблемой.Позвольте мне указать на это:

template<typename T, typename... A>
class llazy
{

public:
    llazy(const std::function<T(A...)>& func, A... args) : func(func), vec({args...}), numArgs(sizeof...(args))
    {}
    const T& operator[](size_t index)
    {
        unsigned short tmp = 1;
        //Here I want to stray from 2 elements to pass to function and make the number at least like 0-4
        std::vector<size_t> v;
        for (unsigned short i = 0; i < numArgs; i++)
            v.emplace_back(vec.size() - tmp++);
        //As you can see here, there are no issues(if the vector has enough elements ofc) with these two
        unsigned long long i = vec.size() - 2, j = vec.size() - 1;
        while (vec.size() < index + 1)
            //So how do I pass all the vec[v[0]], vec[v[1]], etc... elements to the "func"?
            //Maybe there is another way to achieve this, however, this is the Python which makes me think this is possible
            vec.emplace_back(func(vec[i++], vec[j++]));
        if (vec.size() >= index + 1)
            return vec[index];
    }
private:
    const unsigned char numArgs;
    const std::function<T(A...)> func;
        std::vector<T> vec;
    };

using ullong = unsigned long long;

int main()
{
    llazy<ullong, ullong, ullong> l(std::function<ullong(ullong, ullong)>([](ullong i, ullong j) { return i + j; }), 1, 1);
    l[20];
    l[50];
    l[1000];
    return 0;
}

Спасибо за ваши ответы заранее.

UPD: Конечно, вектор может быть передан функции, однако это делает сами функциинамного менее читаемый (например, беззнаковая сумма (без знака, без знака) гораздо более понятна, чем беззнаковая сумма (std :: vector)).

1 Ответ

0 голосов
/ 12 февраля 2019

Как использовать последние N элементов вектора в качестве параметров функции

Вам не нужно помещать эти элементы во временный вектор.

Вместо этого, классическим решением этого является использование отдельной функции (или лямбда-шаблона C ++ 20, если вам это нравится) с параметром std::index_sequence (и набором параметров индексов).С расширением пакета вы можете легко извлечь последние N элементов из вашего вектора, так или иначе.

Примерно так будет работать:

template <typename F, std::size_t ...I>
auto make_tuple_seq(std::index_sequence<I...>, F &&func)
{
    return std::tuple{func(I)...};
}

int main()
{
    std::vector v = {1,2,3,4,5,6};
    const int n = 3;
    auto t = make_tuple_seq(std::make_index_sequence<n>{}, 
                            [&](std::size_t i) {return v[v.size() - n + i];});

    // Prints `456`.
    std::cout << std::apply([](int x, int y, int z){return x*100 + y*10 + z;}, t) << '\n';
}

Это не должно быть сложно адаптироватьэтот код для ваших нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...