次のようなデータ構造があります。map<string, map<string, map<string, MyObj>>>
現在、同じ for ループ メソッドを使用する複数の関数があります。
for (auto p1 : myMap)
for (auto p2 : p1.second)
for (auto p3 : p2.second)
doThingsWith(p1, p2, 3);
関数doThingsWith(p1, p2, p3)
間、および for ループの前後のコードによって異なります。MyObj
また、たとえばオブジェクトにアクセスするだけでよい関数もあれば、オブジェクトだけでなくすべての文字列キーにアクセスする必要がある関数もありMyObj
ます。
問題は、パフォーマンスを落とさずにこれを一般化する方法はありますか? タプルのベクトルを返す関数を思いつきました。
vector<tuple<string, string, string, MyObj>> getData(... &myMap)
{
vector<tuple<string, string, string, MyObj>> data;
for (auto p1 : myMap)
for (auto p2 : p1.second)
for (auto p3 : p2.second)
data.push_back(tuple<string, string, string, MyObj>(
p1.first, p2.first, p3.first, p3.second
));
return data;
}
そして今、私の関数はこれを使用できます:
for (auto t : getData(myMap))
doThingsWith(get<0>(t), get<1>(t), get<2>(t), get<3>(t));
しかし、これは巨大なので、不必要に多くのタプルとベクトルを構築します。myMap
もっと良い方法はありますか?Python ではジェネレーターを使用できますが、同等の C++ はわかりません。
def iterTuples(myMap):
for k1, v1 in myMap.items():
for k2, v2 in v1.items():
for k3, v3 in v2.items():
yield k1, k2, k3, v3
for k1, k2, k3, val in iterTuples(myMap):
doThingsWith(k1, k2, k3, val)