簡體   English   中英

在stl地圖中進行后序遍歷

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM