Замечательная индексация в C ++ с использованием boost :: range

Я бы хотел использовать boost :: range для реализации чего-то похожего на "модное индексирование", доступное в NumPy и Matlab. В частности, , Я хотел бы выбрать определенные элементы одного индексируемого контейнера, используя в качестве индексов элементы другого контейнера. Например, в Python можно сделать следующее:

>>> squares = numpy.arange(10)**2  # Step 1 - setup squares
>>> indices = numpy.array([1,3,4]) # Step 2 - setup indices
>>> squares[indices]               # Step 3 - fancy indexing
array([ 1, 9, 16])

I n C ++, используя boost :: range, я думаю, что приведенный выше код будет выглядеть примерно так:

#include "sampled.hpp"
#include <boost/assign/std/vector.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/counting_range.hpp>
#include <iostream>
#include <vector>

using namespace boost;
using namespace boost::adaptors;
using namespace boost::assign;
using namespace boost::lambda;
using namespace std;

int main(int argc, char** argv)
{
    // Step 1 - setup squares
    vector<int> squares;
    push_back(
        squares,
        counting_range(1,11) | transformed(ret<int>(_1 * _1))
    );

    // Step 2 - setup indices
    vector<size_t> indices;
    indices += 1,3,4;

    // Step 3 - fancy indexing
    for_each(
        squares | sampled(indices),
        cout << _1 << constant(" ")
    );

    return 0;
}

Поскольку имя "indexed" уже используется существующим адаптером диапазона (boost :: adapter :: indexed), я вызвал пока еще не реализованный адаптер индексирования "отобран" в приведенном выше коде.

Кто-нибудь знает, существует ли такой адаптер где-то в ускоренном режиме или есть ли у него реализация, которой они хотели бы поделиться? Я начал пытаться реализовать это сам, сначала написав «sampled_iterator» (используя iterator_adaptor), а затем «sampled_range» (используя iterator_range), но я нахожу это довольно сложным.

9
задан dsmith 29 August 2011 в 14:59
поделиться