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::map
mit std::string
Schlüsseln und möchte einen Vektor daraus konstruieren, indem ich die Ressourcen der map
s-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, map
aber 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, map
weil ich auf eine Weise darauf zugegriffen habe, std::map
die 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::string
hat 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.
const
Werts ist immer UB.