C ++ 'da, artık ihtiyaç duymadığım bir haritadan kaynakları çalmak sorun değil mi? Daha doğrusu, ben bir olduğunu varsayalım std::map
ile std::string
anahtar ve ben kaynaklarını çalarak bunun bir vektör dışarı inşa etmek istiyorum map
kullanarak s tuşları std::move
. Anahtarlara böyle bir yazma erişiminin iç veri yapısını (anahtarların sıralaması) bozduğunu map
ancak daha sonra kullanmayacağımı unutmayın.
Soru : Bunu herhangi bir sorun olmadan yapabilir miyim yoksa beklenmedik bir hataya yol açacak map
mıyım std::map
?
İşte bir örnek program:
#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;
}
Çıktı üretir:
key before stealing: aLongString
key after stealing:
key before stealing: anotherLongString
key after stealing:
EDIT: Bunu büyük bir haritanın tüm içeriği için yapmak ve bu kaynak çalmak tarafından dinamik ayırma kaydetmek istiyorum.
std::string
kısa dize optimizasyonudur. Bu, yalnızca işaretçi değişiminde değil, kopyalama ve taşımada önemsiz olmayan bir mantık olduğu anlamına gelir ve ayrıca çoğu zaman hareket etmek kopyalama anlamına gelir - oldukça uzun dizelerle uğraşmak için. İstatistiksel fark her halükarda küçüktü ve genel olarak, ne tür bir dize işlemenin gerçekleştirildiğine bağlı olarak kesinlikle değişir.
const
değeri değiştirmek her zaman UB'dir.