首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stl map中的Postorder遍历

stl map中的Postorder遍历
EN

Stack Overflow用户
提问于 2012-10-11 18:48:18
回答 2查看 1.4K关注 0票数 5

我在gcc计算机上使用了一个stl映射,它使用一个树来存储键、值对。迭代器以有序的方式前进,因此有序遍历非常容易。但是,我的输出需求之一是后序遍历。我特别熟悉使用map。有没有办法把这件事做完?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-11 19:11:12

正如Steve Jessop所说,Map是由c++提供的抽象数据结构,您不能以任何顺序更改存储在map中的元素的顺序,就像我们在树或AVL中通过按顺序遍历pre/post/in order所做的那样。但是,您可以通过使用std::greater而不是std::less作为键来颠倒存储顺序。

例如:

代码语言:javascript
复制
std::map< std::string, int, std::greater<std::string> > my_map; 

或者创建一个矢量desiredOrder,这将保持地图中插入顺序的跟踪,完成插入后,只需在desiredOrder矢量上按之前/之后/顺序执行任何排序操作,并使用for循环,您可以遍历矢量并使用矢量值作为地图的键来访问地图元素

e.g

代码语言:javascript
复制
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';
}
票数 0
EN

Stack Overflow用户

发布于 2012-10-11 18:53:27

此外,该标准并不确切知道(或关心) map的元素在映射可能使用的任何内部树中是如何排列的。红黑树和AVL树都是std::map的有效实现,根据实际使用的情况,你会得到不同的后序遍历。在实践中,我希望它总是R-B或非常类似,但实现的自由度通知由标准定义的接口。

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

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12837840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档