2015-06-05 72 views
2

我需要一個std::map容器有類似:有沒有辦法有一個std ::地圖沒有聲明價值型

[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]

  1. 關鍵"a1"擁有另一個std::map值,但密鑰"a2"具有整數值。在這種情況下,我該如何聲明地圖?

  2. 有沒有辦法將值更改爲另一種類型?例如,如果我想將"a12"的值更改爲std::vector

謝謝。

+1

一些簡單的建議,用python和ruby等動態語言來做這件事更容易。靜態類型不適用於這個問題。有許多可能的解決方案,但它們都涉及在應用程序代碼中嵌入類型,可能不合適。 – ceorron

+0

@ceorron謝謝,是的,在python和ruby中執行此操作要容易得多。實際上,當我試圖將python代碼轉換爲C++時,我遇到了這個問題。 –

回答

4

不,你不能馬上這樣做。考慮使用一些類型擦除設備,最好是類型安全的並且很好理解,如boost::variantboost::any。否則,您可以製作一個value類,其中包含一個不透明的堆分配緩衝區(老派void*),您應該根據enum字段的值將其轉換爲類型。

+0

謝謝,'boost :: any'適合我。 –

0

我不能完全理解你的問題。我得到的是你想要插入不同類型的值。第一個鍵將包含該地圖另一個鍵指向的另一個地圖的「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)); 

這是否解決了您的問題?

0

關鍵字「a1」具有另一個std :: map的值,但關鍵字「a2」具有整數值。在這種情況下,我該如何聲明地圖?

你不能申報這樣的地圖。地圖的所有值都具有相同的類型。

有沒有辦法將值更改爲另一種類型?例如,如果我想將「a12」的值更改爲std :: vector?

你大概的意思,「有沒有辦法來恰克變量的型的另一個」。答案是不。

但是,可以定義一個可以包含任何類型數據的類型。這並不是簡單的實現,但你很幸運,Boost已經實現了這樣的類型:boost::any。然後,具有這種值類型的地圖可以包含在any對象中包含的任何類型的值。我會建議重新考慮你的設計,這樣你就不需要擁有任何類型的對象。

0

不,每個STL容器類型都需要確切的ONE類型。對於你的想法,你需要一個可以容納多種類型的容器類型。爲此,您可以使用http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html

1

當使用std :: map時,您需要指定值類型。如果你想映射到不同類型的我想的對象,你有兩種可能性:

定義該值的基類,並聲明

std::map<int, base_class_t *> 

地圖,更好

std::map<int, shared_ptr<base_class_t>> 

然後你可以插入不同的對象,全部來自base_class_t。

outher選項是映射到工會。但我不會這樣做;-)

0

我想,可能是一個部分模板類與定義的一個參數可能是你的問題的答案,就像這樣;

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)); 
} 

所以,你可能隱約使用相同的類與預定義的第一個參數,並在任何你需要的功能定義的第二個。

相關問題