0

次のようなデータ構造があります。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)
4

2 に答える 2