Qt 5.10 以降、単純なラッパー クラスを使用して範囲ベースの for ループを使用できますが、マップ エントリのキーと値の両方にアクセスできます。
次のコードを、ソース ファイルの先頭またはインクルードするヘッダーのどこかに配置します。
template<class K,class V>
struct QMapWrapper {
const QMap<K,V> map;
QMapWrapper(const QMap<K,V>& map) : map(map) {}
auto begin() { return map.keyValueBegin(); }
auto end() { return map.keyValueEnd(); }
};
すべてのエントリを反復処理するには、次のように単純に記述できます。
QMap<QString, QString> extensions;
//..
for(auto e : QMapWrapper(extensions))
{
fout << e.first << "," << e.second << '\n';
}
の型はe
、QKeyValueIterator のドキュメントstd::pair<const QString&, const QString&>
で部分的に指定されているとおりになります。
メンバー変数map
は、マップの暗黙的な共有コピーであり、これが一時的な値で使用された場合のセグメンテーション違反を回避します。したがって、ループ内でマップを変更しない限り、一定のオーバーヘッドはわずかです。
上記の例では、C++17 で導入されたクラス テンプレート引数 deductionを使用しています。古い標準を使用している場合は、コンストラクターを呼び出すときに QMapWrapper のテンプレート パラメーターを指定する必要があります。この場合、ファクトリ メソッドが役立つ場合があります。
template<class K,class V>
QMapWrapper<K,V> wrapQMap(const QMap<K,V>& map) {
return QMapWrapper<K,V>(map);
}
これは次のように使用されます。
for(auto e : wrapQMap(extensions))
{
fout << e.first << "," << e.second << '\n';
}