これは昨日からの私の質問のフォローアップです。書き込み専用コードについてのScottMeyersの警告が頭に浮かびます。std :: mapのキーまたは値にアクセスするために標準的なアルゴリズムを使用するという原則のアイデアは気に入っていますが、必要な構文は少しバロック的なIMHOです。マップのすべてのキーをベクトルにダンプしたいとします。次の宣言が与えられた場合、
typedef std::map<int, int> MyMap;
MyMap m;
std::vector<int> v;
どのコードがより保守しやすい(つまり、混乱が少ない可能性がある)か?
オプション1:
std::transform(m.begin(),
m.end(),
std::back_inserter(v),
std::tr1::bind(&MyMap::value_type::first, _1));
オプション#2:
for (MyMap::iterator i = m.begin(); i != m.end(); ++i)
{
v.push_back(i->first);
}
オプション1はより標準的なライブラリ風ですが、何が起こっているのかを理解するには、それを精神的に分解する必要があります。オプション2は、実行時のペナルティがわずかになる可能性がありますが、読みやすいようです。私はCPU時間を傷つけていないので、オプション2に傾いています。皆さんは同意しますか?考慮すべき3番目のオプションはありますか?
PSこの質問を書く過程で、(私のプロジェクトにとって)std :: mapのキーを読み取る最良の方法は、それらをサイドコンテナーに格納し、それを繰り返すことであると結論付けました。ただし、保守性の問題は依然として残っています。