C ++では、後で不要になったマップからリソースを盗んでも大丈夫ですか?より正確には、std::map
with std::string
キーがあり、をmap
使用してsキーのリソースを盗むことでそれからベクターを構築したいと仮定しますstd::move
。キーへのそのような書き込みアクセスは、内部データ構造(キーの順序)を破壊することに注意してください。ただし、map
後で使用することはしません。
質問:問題なくこれを実行できますか?または、意図されていないmap
方法でアクセスしたために、たとえばのデストラクタで予期しないバグが発生std::map
しますか?
以下はプログラム例です。
#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;
}
それは出力を生成します:
key before stealing: aLongString
key after stealing:
key before stealing: anotherLongString
key after stealing:
編集:私はこれを大きなマップのコンテンツ全体に対して行い、このリソースを盗むことによって動的な割り当てを保存したいと思います。
std::string
短い文字列の最適化です。ポインタの交換だけでなく、コピーと移動にはいくつかの重要なロジックがあることを意味します。さらに、ほとんどの場合、移動はコピーを意味します。かなり長い文字列を処理しないようにしてください。統計の差はとにかく小さく、一般的にはどのような文字列処理が行われるかによって確かに異なります。
const
値の変更は常に UBです。