2017-04-02 4 views
1

Ich möchte eine vorhandene Ansicht für die Verkettung verwenden. In code:Wie man zwei bestehende Bereiche contract :: view?

Mit anderen Worten - wie kann ich eine Sicht auf mehrere Vektoren erstellen, deren Anzahl bis zur Laufzeit nicht bekannt ist?

+0

Welche ist ' newRange' und können wir die 'foo()' Funktion sehen? Auch wofür ist "v"? – Galik

+0

@Galik Ich habe den Code aktualisiert. Die Funktion 'foo()' gibt eine const-Referenz zurück, ist aber für meine Frage nicht relevant. – nikitablack

+0

Ich denke, das ist ziemlich schwierig mit den Bereichen zu tun. Betrachte n Bereiche mit verschiedenen Elementen. Nun zeigen ein begin() und end() des Gesamtbereichs auf() des ersten und end() des letzten, und dazwischen muss er verfolgen, ob wir am Ende des k-ten Bereichs sind, und gehe zu (k + 1). '' view :: concat'' zur Kompilierzeit erreicht dies mit ziemlich viel Maschinerie. – skgbanga

Antwort

2

Sie können auf diese Weise keine Ansichten erstellen. Das Verketten einer Ansicht ergibt ein Objekt mit einem anderen Typ. Sie können es nicht der ursprünglichen Ansicht zuweisen, da sein Typ anders ist.

Sie können den Effekt sind Sie erhalten, nachdem sie mit einer Kombination aus view::cycle (nimmt einen Bereich und wiederholt es unendlich) und view::take (nimmt die ersten N Elemente eines Bereichs).

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

EDIT

Wenn foo() jedes Mal einen Verweis auf einen anderen Vektor zurückkehren können, dann können Sie view::generate und view::join, zusätzlich zu view::take verwenden:

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

Dies wird nicht tun, was Sie wollen, wenn 'foo()' verschiedene Vektoren aus mehreren Aufrufen zurückgibt. Sie würden eine flatternde ('view :: join'?) Operation benötigen, um das zu erstellen – Caleth

+0

@Eric Kann dies mit einem Typ gelöscht Iterator-Bereich getan werden? (Dies erfordert natürlich Änderungen im Bibliothekscode für den Bereich-v3). Aber im Grunde haben wir einen Bereich, der ein Anfang/Ende hat und intern eine Liste mit Anfangs- und Endwerten enthält. Während der Iteration verfolgt er den k-ten Bereich und bewegt sich am Ende zu (k + 1) -ten. Übrigens, das ist sehr ähnlich wie eine Deque implementiert ist. Und das kann gemacht werden, um RandomAccessIterator zu modellieren. Ob das alles nützlich ist, ist eine andere Sache :) – skgbanga

+0

@Caleth Ich habe die Antwort aktualisiert, danke. –

Verwandte Themen