我需要一個std::map
容器有類似:有沒有辦法有一個std ::地圖沒有聲明價值型
[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]
關鍵
"a1"
擁有另一個std::map
值,但密鑰"a2"
具有整數值。在這種情況下,我該如何聲明地圖?有沒有辦法將值更改爲另一種類型?例如,如果我想將
"a12"
的值更改爲std::vector
?
謝謝。
我需要一個std::map
容器有類似:有沒有辦法有一個std ::地圖沒有聲明價值型
[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]
關鍵"a1"
擁有另一個std::map
值,但密鑰"a2"
具有整數值。在這種情況下,我該如何聲明地圖?
有沒有辦法將值更改爲另一種類型?例如,如果我想將"a12"
的值更改爲std::vector
?
謝謝。
不,你不能馬上這樣做。考慮使用一些類型擦除設備,最好是類型安全的並且很好理解,如boost::variant
或boost::any
。否則,您可以製作一個value
類,其中包含一個不透明的堆分配緩衝區(老派void*
),您應該根據enum
字段的值將其轉換爲類型。
謝謝,'boost :: any'適合我。 –
我不能完全理解你的問題。我得到的是你想要插入不同類型的值。第一個鍵將包含該地圖另一個鍵指向的另一個地圖的「int Value」。第二個鍵將包含一個純整數。如果是這種情況,爲什麼不在地圖中使用矢量。
std::map<int, std::vector<int>> mymap;
std::vector <int> vec;
vec.push_back(5);
mymap.insert(make_pair(1, vec));
此外,如果您不確定數據類型。你也可以使用嵌套地圖。第二個元素只是放一個虛擬鍵。
std::map<int, std::map<int,int>> mymap;
std::map <int, int> mappy;
mappy.insert(make_pair(0,5));
mymap.insert(make_pair(1, mappy));
這是否解決了您的問題?
關鍵字「a1」具有另一個std :: map的值,但關鍵字「a2」具有整數值。在這種情況下,我該如何聲明地圖?
你不能申報這樣的地圖。地圖的所有值都具有相同的類型。
有沒有辦法將值更改爲另一種類型?例如,如果我想將「a12」的值更改爲std :: vector?
你大概的意思,「有沒有辦法來恰克變量的型的另一個」。答案是不。
但是,可以定義一個可以包含任何類型數據的類型。這並不是簡單的實現,但你很幸運,Boost已經實現了這樣的類型:boost::any
。然後,具有這種值類型的地圖可以包含在any
對象中包含的任何類型的值。我會建議重新考慮你的設計,這樣你就不需要擁有任何類型的對象。
不,每個STL容器類型都需要確切的ONE類型。對於你的想法,你需要一個可以容納多種類型的容器類型。爲此,您可以使用http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html
當使用std :: map時,您需要指定值類型。如果你想映射到不同類型的我想的對象,你有兩種可能性:
定義該值的基類,並聲明
std::map<int, base_class_t *>
地圖,更好
std::map<int, shared_ptr<base_class_t>>
然後你可以插入不同的對象,全部來自base_class_t。
outher選項是映射到工會。但我不會這樣做;-)
我想,可能是一個部分模板類與定義的一個參數可能是你的問題的答案,就像這樣;
template <typename T>
class partialMap : public std::map<int,T>
{
};
int main()
{
//vector example
std::vector <int> vec;
partialMap<std::vector<int>> _vecMap;
vec.push_back(5);
_vecMap.insert(make_pair(1, vec));
//map example
std::map<int,int> map;
partialMap<std::map<int,int>> _mapMap;
vec.push_back(5);
_mapMap.insert(make_pair(1, map));
}
所以,你可能隱約使用相同的類與預定義的第一個參數,並在任何你需要的功能定義的第二個。
一些簡單的建議,用python和ruby等動態語言來做這件事更容易。靜態類型不適用於這個問題。有許多可能的解決方案,但它們都涉及在應用程序代碼中嵌入類型,可能不合適。 – ceorron
@ceorron謝謝,是的,在python和ruby中執行此操作要容易得多。實際上,當我試圖將python代碼轉換爲C++時,我遇到了這個問題。 –