Verschmelzen / Abflachen von Untervektoren in einen einzelnen Vektor c ++ (Konvertieren von 2d in 1d) [Duplizieren]

8

Ich habe vector<vector<int> > Y . Ich möchte die Untervektoren (nennen Sie es y) in Y in ein vector<int> zusammenführen. Aber ich möchte sie nicht sortieren, d. H. Sie in der Reihenfolge ihres Auftretens zusammenführen. Wie würde ich das effizient machen, vielleicht mithilfe von STL-Algorithmen? Die std::merge -Methode verschmilzt durch Sortieren, was ich nicht will.

Bearbeitungen: Was ich will, ist: gegeben {{1,6,5}, {5,3-1,77}, {0}, ...} zurück {1,6,5,5,3, -1,77, 0, ...}

    
Utkrist Adhikari 25.06.2013, 10:14
quelle

2 Antworten

13

Das Wort dafür ist Verkettung oder flach :

%Vor%

Oder, tatsächlich einfacher:

%Vor%

c enthält jetzt 1,2,3,9,0, -7

Sie können dies verallgemeinern, um mit Ihrem verschachtelten Container umzugehen:

%Vor%

Wenn Sie Elemente vom ersten Container in den letzten verschieben möchten (falls die Elemente nur verschiebbar oder teuer zu kopieren sind), verwenden Sie std::move mit std::back_inserter oder wenden Sie std::make_move_operator auf jeden Quelleniterator an.

Sehen Sie es live auf Coliru

Update: Variadische Verkettung

Zunächst hatte ich erwartet, dass Sie nach einer variadischen Lösung suchen: Lassen Sie mich demonstrieren, wie Sie dies viel allgemeiner machen können, also können Sie sagen:

%Vor%

Tatsächlich habe ich es so allgemein gehalten, dass Sie heterogene Sammlungen in "willkürliche" Container verketten:

%Vor%

Sie werden (zu Recht) erwarten, dass to_vector nur eine Bequemlichkeitsverkürzung für concatenate<std::vector<...>> ist. Hier ist der volle Monty, sehen Sie live auf Coliru und ideone :

%Vor%

Ausgabe:

%Vor%     
sehe 25.06.2013, 10:19
quelle
8
%Vor%

Im Vergleich zur Lösung von @ not-sehe hat dies einige Leistungsvorteile:

  • Er berechnet die endgültige Größe des Ergebnisses und weist den Speicher vor. Dies bedeutet, dass eine wiederholte Neuzuweisung nicht erforderlich ist.
  • Es verwendet Range-Insert statt Single-Element-Insert wie die andere Version. Dadurch kann der Container einige Optimierungen vornehmen, insbesondere wenn die Elemente trivial kopierbar sind (d. H. Ein einzelnes Memcpy pro innerem Container).

Auf der Unterseite funktioniert es nur mit Vektor, nicht Deque oder Liste.

    
Sebastian Redl 25.06.2013 14:11
quelle

Tags und Links