2

関数によって返された範囲を 1 つの大きな範囲に連結したいと考えています。次のコードを検討してください。

some_type_i_cant_figure_out bar() {
    typedef std::vector<int>::const_iterator iter;
    std::vector<int> aaa;
    /* fill some data into aaa*/
    some_type_i_cant_figure_out cc;
    for (int i = 0; i < aaa.size(); ++i) {
    std::pair<iter, iter> bbb = foo(aaa, i);
    ccc = boost::join(ccc, bbb);
    }
    return ccc;
}

私が達成しようとしていること:
aaa ベクトルは巨大で、 foo は非常に大きな範囲を返す可能性があります。もちろん、範囲内のすべての要素のコピーを新しい整数のベクトルに作成して返すこともできます。非効率的で、メモリと時間を浪費します。したがって、boost::joined_range を 1 つ返したいと思います。最悪の場合、範囲のベクトルを使用できますが、単純すぎてエレガントではありません:) Joined_range がデフォルトで構築可能ではないことに加えて (この実装例では問題になります)、戻り値の型は何でしょうか? 一時変数 (ccc) 型と、上記を達成するための正しくエレガントな方法は何でしょうか?

4

1 に答える 1

1

まず、コードの最終結果は次のようになります。

auto cc(aaa);
boost::stable_sort(cc);

aaa(サンプルコードから、範囲内の整数が含まれていると仮定します[0..size()-1)

単純にコピーする余裕がある場合は、backinsert イテレータを使用してください。

std::vector<int> cc;
for (size_t i = 0; i < aaa.size(); ++i)
    boost::copy(boost::equal_range(aaa, i), back_inserter(cc));

それ以外の場合は、次を使用して累積結合を非表示にできますany_range

boost::any_range<int, boost::forward_traversal_tag, int> r;
for (size_t i = 0; i < aaa.size(); ++i)
    r = boost::join(r, boost::equal_range(aaa, i));

Live On Coliru

#include <boost/range/any_range.hpp>
#include <boost/range/join.hpp>
#include <boost/range/algorithm.hpp>
#include <iostream>

int main() {
    std::vector<int> const aaa { 1,1,1,4,5,5,9,42,42,42,42,42,42 };

    boost::any_range<int, boost::forward_traversal_tag, int> r;
    for (size_t i = 0; i < aaa.size(); ++i)
        r = boost::join(r, boost::equal_range(aaa, i));

    boost::copy(r, std::ostream_iterator<int>(std::cout << "result: ", " "));
}

版画

result: 1 1 1 4 5 5 9
于 2014-11-19T09:07:48.067 に答える