[英]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.