Verknüpfen einer Sequenz von std :: -Arrays

7

Betrachten Sie Folgendes: ( ​​Wandbox )

%Vor%

Gegeben sei eine Sequenz von std::array<T, length1> , std::array<T, length2> , ..., std::array<T, lengthK> , wie kann ich den obigen Code verallgemeinern und eine Funktion schreiben, die die Sequenz zu einem std::array<T, sum(lengths)> ?

verknüpft?

Es wäre schön, wenn es eine Möglichkeit gäbe, eine wiederverwendbare Funktion zu schreiben, die eine ähnliche Folge von Template-Klassen mit einer gegebenen binären Operation reduziert, zB concat im obigen Beispiel, anstatt eine spezielle Methode zu schreiben (welche müsste jedes Mal neu geschrieben werden, wenn sich das binäre Op ändert).

(IICU, die relevanten Algorithmen der Standardbibliothek ( accumulate , reduce ) funktionieren nur, wenn die Klasse des Ergebnisses der binären Operation immer gleich ist.)

    
Danra 12.03.2017, 15:09
quelle

7 Antworten

6

Sie können Folgendes tun:

%Vor%

Mit Verwendung

%Vor%

und

%Vor%

Demo

    
Jarod42 12.03.2017, 15:44
quelle
5
  

Gegeben sei eine Sequenz von std::array<T, length1> , std::array<T, length2> , ..., std::array<T, lengthK> , wie kann ich eine Funktion schreiben, die die Sequenz zu einem std::array<T, sum(lengths)> ?

verknüpft?

Hier ist eine C ++ 17-Lösung. Es kann sehr wahrscheinlich verkürzt und verbessert werden, indem daran gearbeitet wird.

%Vor%

Verwendung:

%Vor%

Live-Wandbox-Beispiel

Funktioniert sowohl mit g ++ 7 als auch mit clang ++ 5 .

    
Vittorio Romeo 12.03.2017 15:33
quelle
2

Meine erste Argumentationslinie wäre, das Array in ein Tupel von Referenzen zu verwandeln (ein Bindeglied), mit tuple_cat zu manipulieren und dann jede Operation auszuführen, die notwendig ist, um das endgültige Array zu erstellen (dh entweder verschieben oder kopieren) zu den ursprünglich übergebenen Argumenten):

%Vor%

erwartete Ergebnisse:

%Vor%     
Richard Hodges 12.03.2017 15:50
quelle
2

C ++ 14.

%Vor%

Damit können wir Parameterpakete inline erweitern.

%Vor%

was uns zu zwei bringt. Für N ist der einfache Weg:

%Vor%

aber es sollte ohne Rekursion möglich sein.

Code nicht getestet.

    
Yakk 12.03.2017 17:19
quelle
2

Hier ist eine einfache C ++ 17-Lösung über Falte Ausdrücke :

%Vor%

Beispiel für die Verwendung:

%Vor%

Live-Demo

    
Constructor 13.03.2017 22:23
quelle
1

Streng C ++ 11; nicht so lesbar wie @ Jarod42, aber möglicherweise viel effizienter mit vielen Arrays, wenn der Aufrufbaum nicht vollständig abgeflacht ist (in Bezug auf Inlining), da nur ein Ergebnisobjekt vorhanden ist und nicht mehrere temporäre, progressiv wachsende Ergebnisobjekte:

%Vor%

Online-Demo

Beachten Sie, dass dies auch ordnungsgemäß weitergeleitet wird, indem Sie den Algorithmus std::move für rvalues ​​und nicht für% co_de verwenden %.

    
ildjarn 12.03.2017 21:46
quelle
1

Dies wird nicht verallgemeinert, sondern nutzt die Tatsache aus, dass wir, wenn wir zwei Arrays innerhalb einer Reihe von Klammern splattern, diese verwenden können, um ein neues Array zu initialisieren.

Ich bin mir nicht sicher, wie nützlich Generalisierung ist, in jedem Fall. Angesichts einer Reihe von Feldern mit nicht übereinstimmenden Größen, was gibt es sonst noch zu tun, aber verbinden Sie sie alle zusammen?

%Vor%     
DrPizza 13.03.2017 08:33
quelle

Tags und Links