繁体   English   中英

在stl地图中进行后序遍历

[英]Postorder traversal in stl map

我在gcc comper上使用stl映射,它使用树来存储键值对。 迭代器按顺序进行,因此顺序遍历非常简单。 但是我的一个输出要求是后序遍历。 我一直特意使用地图。 有没有办法完成它?

没有标准方法来访问std::map实例的“实际树结构”。

此外,该标准不知道(或关心) map元素在地图可能使用的任何内部树中的排列方式。 红黑树和AVL树都是std::map有效实现,你会得到一个不同的后序遍历,实际上是根据它实现的。 在实践中,我希望它总是RB或非常相似,但实现自由通知标准定义的接口。

简而言之, std::map不是树,它是一个可以(并且是)使用树实现的抽象数据结构。

有可能破解特定的实现,但最好不要。 如果您希望数据的树结构成为程序的已定义状态的一部分,则可以编写自己的树。

正如Steve Jessop所说Map是c ++提供的抽象数据结构,你不能以任何顺序改变地图中存储的元素的顺序,就像我们可以通过前/后/顺序遍历Tree或AVL一样。 但是你可以通过使用std::greater作为键而不是std::less来反转存储顺序。

例如

std::map< std::string, int, std::greater<std::string> > my_map; 

或者创建一个Vector desiredOrder,它将在地图中保留插入顺序的trac,一旦完成插入,只需在desiredOrder Vector上按顺序执行前/后/顺序排序操作,并使用for循环可以遍历使用矢量值作为Map的关键向量并访问Map元素

例如

std::vector<std::string> desiredOrder;
std::map<std::string, int> myTree;

myTree["A"] = 0;
desiredOrder.push_back("A"); 
myTree["B"] = 0;
desiredOrder.push_back("B");
myTree["C"] = 0;
desiredOrder.push_back("C");
myTree["D"] = 0;
desiredOrder.push_back("D");

/*
Do whatever sorting you want to do here....
*/

for (int i = 0; i < desiredOrder.size(); ++i)
{
    const std::string &s = desiredOrder[i];
    std::cout << s << ' ' << myTree[s] << '\n';
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM