2017-04-02 15 views
1

連結のために既存のビューを使用したいと思います。コード内:2つの既存の範囲を連結する方法::ビュー?

auto rng = view::empty<vector<int>>(); 

for(int i{0}; i < 5; ++i) 
{ 
    vector<int> const & v{foo()}; // returns a reference 
    rng |= view::concat(v); // doesn't compile - error: no viable overloaded '|=' 
}; 

言い換えれば、実行時まで数が分からない複数のベクトルのビューを作成するにはどうしたらいいですか?

+0

どのようなタイプの 'ですnewRange'関数と 'foo()'関数を見ることができますか?また 'v'とは何ですか? – Galik

+0

@Galikコードを更新しました。 'foo()'関数はconst参照を返しますが、私の質問には関係ありません。 – nikitablack

+0

これは、範囲では非常に難しいと思います。異なる要素を持つn個の範囲を考慮する。今度は、範囲全体のbegin()とend()は、最初のend()とend()の開始点を指し、その間ではk番目の範囲の終わりにあるかどうかを追跡する必要があります。 (k + 1)番目に移動する。コンパイル時に '' view :: concat''を実行すると、非常に多くの機械が必要になります。 – skgbanga

答えて

2

このように表示を構成することはできません。ビューを連結すると、異なるタイプのオブジェクトが生成されます。タイプが異なるため、元のビューに戻すことはできません。

あなたはview::cycleの組み合わせで後にしている効果を得ることができますが(1つの範囲を取り、無限にそれを繰り返し)、およびview::takeは(範囲の最初のN要素かかります)。

vector<int> const & v{foo()}; // returns a reference 
auto rng = v | view::cycle | view::take(5 * v.size()); 

EDIT

foo()が、あなたはview::takeに加えて、view::generateview::joinを使用することができ、別のベクトルに毎回参照を返すことができる場合:

auto rng = view::generate(foo) | view::take(5) | view::join; 
+0

'foo()'が複数の呼び出しから異なるベクトルを返すなら、これはあなたが望むことをしません。 – Caleth

+0

@Ericこれは型消去されたイテレータ範囲で行うことができますか? (これは、もちろん、range-v3ライブラリコードの変更を必要とします)。しかし、基本的には、開始点と終了点を持ち、開始点と終了点のリスト/ジップを内部的に保持するRangeがあります。反復中、k番目の範囲を追跡し、最後に(k + 1)番目に移動します。 Btw、これはdequeがどのように実装されているかと非常に似ています。これは、RandomAccessIteratorをモデル化するために行うことができます。 このすべてが役に立つかどうかは別の問題です:) – skgbanga

+0

@Caleth私は答えを更新しました。 –

関連する問題