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])
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::adaptor::indexed) で既に使用されているため、上記のコードではまだ実装されていないインデックス アダプターを「sampled」と呼んでいます。
そのようなアダプターがブーストのどこかにすでに存在するか、または共有しても構わないと思っている実装があるかどうかを誰かが知っていますか? 最初に「sampled_iterator」(iterator_adaptor を使用)、次に「sampled_range」(iterator_range を使用) を記述して、自分で実装しようとしましたが、かなりトリッキーだと思います。