从 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 的类型将是 std::pair<const QString&, const QString&>,正如在 QKeyValueIterator documentation 中部分指定的那样。
成员变量map 是映射的隐式共享副本,以避免与temporary values 一起使用时出现分段错误。因此,只要您不在循环内修改地图,这只会有很小的固定开销。
上面的例子使用了class template argument deduction,它是在C++17中引入的。如果您使用的是旧标准,则必须在调用构造函数时指定 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';
}