In C ++, va bene rubare risorse da una mappa che non mi serve più in seguito? Più precisamente, supponiamo che io abbia una std::map
con le std::string
chiavi e che voglio costruirne un vettore rubando le risorse delle map
chiavi s usando std::move
. Si noti che tale accesso in scrittura alle chiavi corrompe la struttura di dati interna (ordinamento delle chiavi) del map
ma non lo userò in seguito.
Domanda : posso farlo senza problemi o questo porterà a bug imprevisti, ad esempio nel distruttore del map
perché ho std::map
avuto accesso in un modo che non era previsto?
Ecco un esempio di programma:
#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;
}
Produce l'output:
key before stealing: aLongString
key after stealing:
key before stealing: anotherLongString
key after stealing:
EDIT: vorrei fare questo per l'intero contenuto di una grande mappa e salvare allocazioni dinamiche da questo furto di risorse.
std::string
che l'ottimizzazione delle stringhe corte. Ciò significa che esiste una logica non banale nella copia e nello spostamento e non solo nello scambio di puntatori e inoltre la maggior parte delle volte lo spostamento implica la copia - per non avere a che fare con stringhe piuttosto lunghe. La differenza statistica era comunque piccola e in generale varia sicuramente a seconda del tipo di elaborazione della stringa eseguita.
const
valore è sempre UB.