我正在使用gcc编译器上的stl map,它使用树来存储键值对。迭代器按中序遍历方式前进,因此中序遍历非常容易。然而,我的一个输出要求是后序遍历。我被特别要求使用map。有没有办法实现后序遍历呢?
我正在使用gcc编译器上的stl map,它使用树来存储键值对。迭代器按中序遍历方式前进,因此中序遍历非常容易。然而,我的一个输出要求是后序遍历。我被特别要求使用map。有没有办法实现后序遍历呢?
没有标准的方法可以访问std::map
实例的“实际树结构”。
此外,标准不知道(或者不关心)map
元素在任何内部树中的排列方式。红黑树和AVL树都是std::map
的有效实现,根据实际使用的树结构不同,您将获得不同的后序遍历结果。实际上,我预计它始终是R-B或非常相似的,但实现自由性影响了标准定义的接口。
简而言之,std::map
不是一棵树,而是一个抽象数据结构,可以使用树来实现。
也许可以通过破解特定的实现来获取树结构,但最好不要这样做。如果您希望数据的树结构成为程序定义状态的一部分,则可以编写自己的树。
std::greater
作为键而不是std::less
来反转存储顺序。std::map< std::string, int, std::greater<std::string> > my_map;
e.g
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';
}