Wie bewerben Sie sich transformieren, um eine STL-map in C++
In C++, ich bin mit der Transformation zu ändern, die Werte einer map in Großbuchstaben um.
std::map<std::string, std::string> data = getData();
//make all values uppercase
std::transform(data.begin(), data.end(), data.begin(),
[](std::pair<std::string, std::string>& p) {
boost::to_upper(p.second);
return(p);
});
Dieser gibt mir folgende Kompilierungsfehler:
/opt/local/include/gcc46/c++/bits/stl_algo.h:4805:2: error: no match for call to '(main(int, char**)::<lambda(std::pair<std::basic_string<char>, std::basic_string<char> >&)>) (std::pair<const std::basic_string<char>, std::basic_string<char> >&)
Ich glaube, es gibt etwas falsch mit der Art der Argumentation in meinem lambda-Ausdruck. Es ist wahrscheinlich etwas einfach, aber ich kann nicht scheinen, um herauszufinden, was erwartet wird.
- Anstatt davon ausgehen, ein container speichert eine bestimmte Art. Sie können den Zugriff auf die Typ-Informationen über value_type.
std::map<std::string, std::string>::value_type
- danke, ich Lerne noch c++ - Idiome...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihnen fehlt das const bei der ersten Art von paar.
Dies ist jedoch nicht Ihr problem: Sie können nicht mit einem
map
als OutputIterator, als Sie keine Unterstützung für die Zuordnung. Sie können jedoch mutieren das zweite argument mitstd::for_each
.Guten alten
map_to_foobar
:Konzeptionelle Sachen: Aufruf
transform
mit der gleichen Palette als ein-und Ausgang ist durchaus legitim und macht eine Menge Sinn, wenn alle funktoren Rückkehr von Wert und mutieren nicht Ihre Argumente. Allerdings mutierend etwas kann ein schneller (oder zumindest schneller Blick in den code, nevermind der optimierende compiler) und macht sehr viel Sinn, mit member-Funktionen.std::transform
mit einer transform-iterator. Zum Beispiel, meinkey_iterator
, posted in eine Antwort auf eine andere Frage, werden trivial in einem umgebautenvalue_iterator
. Dann würden Sie am Ende mitstd::transform(begin_values(data), end_values(data), begin_values(data), [](std::string s) { boost::to_upper(s); return s; });
. In diesem Fall würde ich vorschlagen, dassstd::for_each
, obwohl, weil es vermeidet unnötiges kopieren.boost::adaptors::map_values
was funktioniert der trick. Darunter auch die unnötige Kopie natürlich.