推广多个嵌套for循环

时间:2018-02-21 12:09:39

标签: c++ for-loop nested generalization

我有这样的数据结构: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 ++ equilevant:

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)

1 个答案:

答案 0 :(得分:3)

你的地图地图从一开始就没有效率。更好的是巩固关键部分:

Concat()

现在你有一个简单有效的解决方案:

var result = NpsViewModelList.Concat(NpsViewModelList2).ToList();

你避免了很多间接。如果您可以使用固定长度的字符串和/或将字符串组合成单个分配,则更多。或者,如果共享第一个和第二个键字符串很重要,则可以使用引用计数字符串类型。