2017-06-15 17 views
-3

首先我是初學者cpp。我們如何定義地圖的地圖裏面像打電話給地圖裏面的地圖

std:: map<std ::string,int> map_0={{"hello",1},{"a",3},{"b",5}} 
std:: map<std ::string,int> map_1={{"hi",2},{"2",3},{"3",4}} 

現在我想分配一些可以參考我的map_0像

 map_1["print"] = (int) & map_0; 

新元素(只是寫下我不知道正確的表達在這裏表示) 這樣我就可以做一些像$map_1["print"]=\%map_0; perl的東西

+3

這是非常不規則的,可能不會工作得很好(特別是在64位系統上)!你能否詳細說明你試圖解決的問題是什麼? *爲什麼*你想要做這樣的事情?請花點時間閱讀[XY問題](http://xyproblem.info/),並考慮它與您的問題之間的關係(詢問有關解決未知問題的具體解決方案)。也請花一些時間[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。 –

+0

@Someprogrammerdude我已經通過他們已經實際的東西是這種線是要轉換爲C++我想獲得幫助 'txCtrlEntry [「scheduleId」] = \%d; ' –

+0

你想要首先做什麼[嚴格的別名規則](http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule)。它不適用於今天的64位系統(其中'int'通常是32位,指針是64位)。我們仍然不知道你想要解決什麼問題,爲什麼你想這樣做。 –

回答

2

要點:試圖天真地將perl代碼移植到C++可能會相當困難;數據結構在兩種語言中的工作方式完全不同。你說你是一個C++初學者......這意味着你可能不是做這種語言翻譯的最佳人選。這就是說,這裏有一些可能性。


你不能在像C++這樣的強靜態類型語言中做這樣的事情。你可以在C++ 17中使用像std::variant這樣的方法,通過讓你的map元素爲int或者其他map或者std::any(同樣在C++ 17中),讓地圖包含任何東西(最接近您可能會得到的perl行爲)。與perl相比,這兩種類型都不是完全簡單易用的。您需要檢查容器中存儲了哪些類型,並使用適當的訪問器函數,否則將根據具體情況獲得編譯錯誤或運行時錯誤。該文檔一定要閱讀!

這裏是一個std::variant的例子。你可以看到,如果你想要多層地圖,嵌套類型聲明可以很快得到相當的垃圾郵件,所以它可能不完全適合你的需求。

std::map<std::string, std::variant<int, std::map<std::string, int>>> m; 

    m["foo"] = 1; 
    m["bar"] = std::map<std::string, int>{ {"baz", 2} }; 
    m["bar"] = 3; 

    std::cout << std::get<int>(m["bar"]) << "\n"; 

您可以使用std::variant::index找出哪些類型列表中的一個,目前存放在variant,除其他方式。

有各種各樣的庫提供了一個變種類型,可以在舊的編譯器和標準庫下工作,或者你甚至可以推出你自己的(儘管thius可能不值得)。還有一些叫做「加標籤」的東西非常相似。

這裏是一個std::any的例子。這樣做的好處是您可以在不需要大量typedef的情況下嵌套多個級別的映射。

std::map<std::string, std::any> m2; 

    m2["foo"] = 1; 
    m2["bar"] = std::map<std::string, int>{ { "baz", 2 } }; 
    m2["bar"] = 3; 
    m2["qux"] = m; 

    std::cout << std::any_cast<int>(m2["bar"]) << "\n"; 

您可以使用std::any::type,看看哪個特定類型的any保持在一個特定的類型,所以你知道用哪一種any_cast

您將需要一個新的編譯器來使用這些功能...我已經使用了visual studio 2017與/std:c++latest和g ++ 7.1與-std=c++17。如果您使用較舊的編譯器,則這些功能可能無法使用。

+0

Rook先生有沒有一種可能的方法來做這種類型的轉換我perl到C++ '$ lastTxCtlEntry - > {status} = \ @tmp;' –