2017-05-27 2 views
1

Ich habe ein std :: vector X von std :: vector von, sagen wir doppelt in C++.Kopieren Sie std :: vector, aber wenden Sie lambda auf jedes Element an.

Wie kann ich X in einen std :: vector Y von int so umwandeln, dass X [i] .size() == Y [i] für alle zulässigen Indizes gilt i?

std::vector< std::vector<int> > X; 
... 
/* What I want to do should look as follows */ 
std::vector<int> Y = std::copy_and_transform(X, lambda_to_get_size); 

Natürlich kann dies mit einer Schleife realisiert werden, aber in C++ 11 möchten wir lambdas stattdessen verwenden. Ich habe nichts dergleichen im std :: -Algorithmus gefunden. Die Standardwerkzeuge scheinen nur Umwandlungen zu geben, die den ursprünglichen Vektor ändern und die es nicht erlauben, den Datentyp zu ändern.

Antwort

4

können Sie std::transform verwenden:

std::vector<int> Y; 
std::transform(X.cbegin(), X.cend(), std::back_inserter(Y), [](const std::vector<int>& value) { 
    return value.size(); 
}); 
+1

Die Frage markiert ist [tag: C++ 11], also würde ich 'const auto' in Lambda etwas kompliziert ändern (' decltype (X) :: const_reference 'oder etwas anderes) – Zereges

+0

@Zereges Danke! Explizit das Schreiben des Typs funktioniert auch :) – Rakete1111

+0

@Zereges, ich stimme dem aus Gründen, die vom Google C++ Entwicklungsteam hier dargelegt wurden, nicht zu: https://google.github.io/styleguide/cppguide.html#auto Stack Overflow ist eine Bildungsseite und zeigt die volle Art der Klarheit. Ich mache mir Sorgen, dass "auto" eine Krücke ist, um nicht darüber nachzudenken, was vor sich geht und reif für übermäßigen Gebrauch/"Missbrauch". –

Verwandte Themen