Dalam C ++, apakah boleh mencuri sumber daya dari peta yang tidak saya perlukan lagi? Lebih tepatnya, anggap saya punya kunci std::map
with std::string
dan saya ingin membuat vektor dengan mencuri sumber daya map
kunci s yang digunakan std::move
. Perhatikan bahwa akses tulis ke kunci merusak struktur data internal (pemesanan kunci) map
tapi saya tidak akan menggunakannya setelah itu.
Pertanyaan : Dapatkah saya melakukan ini tanpa masalah atau akankah ini menyebabkan bug yang tak terduga misalnya di destructor map
karena saya mengaksesnya dengan cara yang std::map
tidak dimaksudkan?
Berikut ini contoh programnya:
#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;
}
Ini menghasilkan output:
key before stealing: aLongString
key after stealing:
key before stealing: anotherLongString
key after stealing:
EDIT: Saya ingin melakukan ini untuk seluruh konten peta besar dan menyimpan alokasi dinamis dengan mencuri sumber daya ini.
std::string
memiliki optimasi string pendek. Berarti ada beberapa logika non-sepele pada penyalinan dan pemindahan, bukan hanya penunjuk penunjuk dan sebagai tambahan sebagian besar waktu pemindahan menyiratkan penyalinan - jangan sampai Anda berurusan dengan string yang agak panjang. Perbedaan statistik kecil sekali dan secara umum pasti bervariasi tergantung pada jenis pemrosesan string yang dilakukan.
const
nilai selalu UB.