stl 映射中的后序遍历

Postorder traversal in stl map

本文关键字:遍历 映射 stl      更新时间:2023-10-16

>我在gcc comper上使用了一个stl映射,它使用树来存储键,值对。迭代器以无序方式前进,因此无序遍历非常容易。但是,我的输出要求之一是后序遍历。我特别喜欢使用地图。有什么办法可以完成它吗?

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

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

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

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

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

例如

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

或crate one Vector desiredOrder,它将保持map中插入顺序的trac,一旦你完成插入,只需在desiredOrder Vector上按顺序执行你想要的pre/post/排序操作,并使用for循环,你可以遍历向量并使用向量值作为地图的键来访问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';
}