如何使用递归遍历嵌套地图的地图?

问题描述 投票:0回答:1

我有嵌套地图,我需要遍历每个级别以打印所有值。

这张地图是为了向您展示我正在尝试使用

recursion
解决的问题的示例。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
    std::map<std::string, VariableContainer> myMap;

    for (int i = 0; i < 3; ++i) {
        VariableContainer var;
        var.variables["A" + std::to_string(i)];

        if (i == 1) {
            VariableContainer childVar;
            for (int j = 1; j < 3; ++j) {
               childVar.variables["X_" + std::to_string(j)];
            }
            var.variables.emplace("B" + std::to_string(i), childVar);
        }
        var.variables["C" + std::to_string(i)];
        myMap.emplace("Node_" + std::to_string(i), var);
    }

    for (auto& var : myMap) {
        std::cout << "var: "<< var.first << std::endl;
        if (var.second.variables.size()>0) {
            for (auto& child : var.second.variables) {
                std::cout << " child: "<< child.first << std::endl;
                if (child.second.variables.size()>0) {
                    for (auto& subChild : child.second.variables) {
                        std::cout << "  subChild: "<< subChild.first << std::endl;
                    }
                }
            }
        }
    }
}

这是输出:

var: Node_0
 child: A0
 child: C0
var: Node_1
 child: A1
 child: B1
  subChild: X_1
  subChild: X_2
 child: C1
var: Node_2
 child: A2
 child: C2

但是我需要得到以下结构的输出:

 node + "." + child + "." + subChild + "." + nsubChilds

Node_0.A0
Node_0.C0
Node_1.A1
Node_1.B1.X_1
Node_1.B1.X_2
Node_1.C1
Node_2.A2
Node_2.C2

这是

VariableContainer.h

#ifndef VARIABLECONTAINER_H
#define VARIABLECONTAINER_H

#include <map>
#include <string>

class VariableContainer
{
public:
    VariableContainer() {}
    std::map<std::string, VariableContainer> variables;
};

#endif // VARIABLECONTAINER_H

我可以将地图嵌套在其他地图中,就像一个分支。我认为使用递归是一个很好的解决方案,因为每次执行程序时嵌套映射的数量都不同。

例如,我可以有这样的东西:

Node_1.B1.X_1.Y_1.Z_1

我尝试了以下递归函数,但没有得到所需的输出。

void MainWindow::showMap(std::map<std::string, VariableContainer> &map) {
    for (auto& var : map) {
        std::cout << "var: "<< var.first << std::endl;
        if (var.second.variables.size() > 0) {
            showMap(var.second.variables);
        }
    }
}

有解决这个问题的想法或建议吗?

c++
1个回答
0
投票

将分支名称传递给函数

showMap()
.

例如

class VariableContainer
{
public:
    VariableContainer() {}
    std::map<std::string, VariableContainer> variables;
};

void showMap(
    const std::string &BranchName,  //I think this is necessary
    const std::map<std::string, VariableContainer> &map
)
{
    for( const auto &var : map )
    {
        std::string VarName = BranchName + var.first;
        if( var.second.variables.empty() )  //if leaf
        {   std::cout << VarName << std::endl;  }
        else
        {   showMap( VarName+".", var.second.variables );   }
    }
}

inline void showMap( const std::map<std::string, VariableContainer> &map )
{   showMap( "", map ); }

int main(int argc, char *argv[])
{
    std::map<std::string, VariableContainer> Root;
    {//construct the test data
        {
            auto &Node_0 = Root["Node_0"].variables;
            Node_0["A0"];
            Node_0["C0"];
        }
        {
            auto &Node_1 = Root["Node_1"].variables;
            Node_1["A1"];
            auto &B1 = Node_1["B1"].variables;
            B1["X_1"];
            B1["X_2"];
        }
        {
            auto &Node_2 = Root["Node_2"].variables;
            Node_2["A2"];
            Node_2["C2"];
        }
    }

    showMap( Root );
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.