我在gcc comper上使用stl map,它使用樹來存儲鍵值對。 迭代器以無序方式前進,所以遍歷非常簡單。 但是我的輸出要求之一是後序遍歷。 我一直專門使用地圖。 有什麼辦法可以完成它嗎?stl地圖中的後序遍歷
回答
正如Steve Jessop所說的Map是由C++提供的抽象數據結構,你不能以任何順序改變存儲在map中的元素的順序,就像我們在Tree或AVL中通過前/後/按順序遍歷一樣。 但您可以使用std::greater
作爲您的密鑰而不是std::less
來反轉存儲順序。
例如
std::map< std::string, int, std::greater<std::string> > my_map;
或 箱子一個矢量desiredOrder,這將保持插入在地圖的順序Trac的,一旦你與插入做只是做任何你想要的排序操作前/後/爲了在desiredOrder矢量並使用循環,你可以遍歷矢量,採用矢量值作爲你的地圖
如
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';
}
如果我們假設一個標準的平衡二叉樹,顛倒順序不等同於使用後序而不是順序。 – jogojapan
謝謝...我不得不解釋所有這些以取消後訂單要求... –
沒有標準的方式來訪問std::map
實例的「實際樹結構」。
此外,標準不知道(或護理)究竟是如何一map
的元素被佈置在地圖上可以使用任何內部樹。紅黑樹和AVL樹都是std::map
的有效實現,並且您將得到不同的事後使用的後序遍歷。在實踐中,我期望它總是R-B或非常相似,但實現自由通知標準定義的接口。
總之,std::map
不是一棵樹,它是一個抽象的數據結構,可以(並且)使用樹來實現。
它可能會破解一個特定的實現,但可能最好不要。如果您希望數據的樹狀結構成爲程序定義狀態的一部分,則可以編寫自己的樹。
- 1. C++中的BFS圖遍歷STL
- 2. 後序遍歷
- 3. 樹遍歷。序,序,後序
- 4. 遍歷地圖內的地圖
- 5. 公式的後序遍歷
- 6. dom樹的後序遍歷
- 7. 在STL中使用宏遍歷
- 8. 圖形預購/後序遍歷?
- 9. 二叉樹的前序遍歷,後序遍歷?
- 10. 如何輸出給定中序和後序遍歷的樹的前序遍歷?
- 11. 簡化嵌套的STL容器遍歷
- 12. STL地圖排序
- 13. Python中的遍歷Java地圖?
- 14. 遍歷模板中的地圖
- 15. 無法遍歷角4中的地圖
- 16. 遍歷地圖與地圖鍵
- 17. 迭代後序遍歷bst?
- 18. 樹後序遍歷性能
- 19. 從前序遍歷和後序遍歷構建樹
- 20. 如何遍歷STL集合並選擇性地刪除元素?
- 21. 地道STL:遍歷列表並插入元素
- 22. 多次有效地遍歷地圖
- 23. 如何遍歷java中的地圖內部地圖
- 24. 只遍歷地圖的一部分
- 25. C++ - 遍歷3個元素的地圖
- 26. 後順序/前序遍歷樹
- 27. Java:顯示前序和後序遍歷
- 28. 普通樹的後序遍歷
- 29. 序言中序遍歷
- 30. 遍歷NSTableView中的視圖
開始從最終的關鍵訪問地圖元素和向後移動? –
我不確定遍歷地圖的順序是否有意義,因爲我懷疑你可以根據插入的順序爲同一組數據獲取稍微不同形狀的樹。雖然所有這些可能的樹的遍歷都是相同的,但後序將是不同的。 – dasblinkenlight