Ist es in C ++ in Ordnung, Ressourcen von einer Karte zu stehlen, die ich danach nicht mehr benötige? Genauer gesagt, ich habe einen std::mapmit std::stringSchlüsseln und möchte einen Vektor daraus konstruieren, indem ich die Ressourcen der maps-Schlüssel mit stehle std::move. Beachten Sie, dass ein solcher Schreibzugriff auf die Schlüssel die interne Datenstruktur (Reihenfolge der Schlüssel) des Schlüssels beschädigt, mapaber ich werde sie danach nicht mehr verwenden.
Frage : Kann ich dies ohne Probleme tun oder führt dies zu unerwarteten Fehlern, beispielsweise im Destruktor von, mapweil ich auf eine Weise darauf zugegriffen habe, std::mapdie nicht dafür vorgesehen war?
Hier ist ein Beispielprogramm:
#include<map>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
std::vector<std::pair<std::string,double>> v;
{ // new scope to make clear that m is not needed
// after the resources were stolen
std::map<std::string,double> m;
m["aLongString"]=1.0;
m["anotherLongString"]=2.0;
//
// now steal resources
for (auto &p : m) {
// according to my IDE, p has type
// std::pair<const class std::__cxx11::basic_string<char>, double>&
cout<<"key before stealing: "<<p.first<<endl;
v.emplace_back(make_pair(std::move(const_cast<string&>(p.first)),p.second));
cout<<"key after stealing: "<<p.first<<endl;
}
}
// now use v
return 0;
}
Es erzeugt die Ausgabe:
key before stealing: aLongString
key after stealing:
key before stealing: anotherLongString
key after stealing:
BEARBEITEN: Ich möchte dies für den gesamten Inhalt einer großen Karte tun und dynamische Zuordnungen durch das Stehlen von Ressourcen speichern.
std::stringhat Short-String-Optimierung. Das bedeutet, dass es eine nicht triviale Logik beim Kopieren und Verschieben gibt und nicht nur beim Zeigertausch. Außerdem bedeutet das Verschieben die meiste Zeit das Kopieren - damit Sie sich nicht mit ziemlich langen Zeichenfolgen befassen. Der statistische Unterschied war sowieso gering und variiert im Allgemeinen sicherlich abhängig davon, welche Art von Zeichenfolgenverarbeitung durchgeführt wird.
constWerts ist immer UB.