stl 映射中的后序遍历
Postorder traversal in stl map
>我在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';
}
相关文章:
- 遍历 std::variant 的映射
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 如何使用迭代器遍历表单 pair<int,pair<int,int>> 的映射
- 遍历std ::映射,效果少于迭代器之间的比较
- 哈希映射和有序遍历
- stl 映射中的后序遍历
- 映射迭代器遍历技术
- C++ 如何在具有 O(n) 遍历的不同映射容器中区分具有带值的重复键和具有值的唯一键的 Multimap
- 有效地遍历映射,同时插入其他线程
- 如何遍历 STL 映射(查找所有可能的对)
- 通过不同的线程使用迭代器遍历 STL 映射
- 如何遍历多映射并打印按键分组的值
- 遍历以向量和映射作为其第二个节点的映射,并在第二个节点的第二个元素中找到匹配项。C++
- C++,如何遍历一个未定义的映射
- 无法遍历模板映射.如何处理这个错误
- 如何遍历映射的映射的映射的映射的映射的映射的映射的映射的映射的映射的映射的向量
- 遍历映射时出错<std::string, std::string>
- 澄清使用for(auto iter: value)遍历映射
- 遍历多映射以查找从给定值到给定关键字的路径
- 在C++中遍历映射的一部分