![](/img/trans.png)
[英]Is there a better alternative to std::unordered_map<std::string, std::any> to have a map of strings to any type of value?
[英]Is there a way to have a std::map without declare the value type
我需要一個std::map
容器,例如:
[ "a" => [ "a1" => [ "a11" => 1, "a12" => 0 ], "a2" => 1 ] ]
鍵"a1"
的值是另一個std::map
,但鍵"a2"
的值是整數。 在這種情況下,如何聲明地圖?
有沒有辦法將值更改為另一種類型? 例如,如果我想將"a12"
的值更改為std::vector
?
謝謝。
不,您不能立即執行此操作。 考慮使用某種類型擦除設備,它們應該是類型安全的並且易於理解,例如boost::variant
或boost::any
。 否則,您可以設計一個value
類,其中包含一個不透明的堆分配緩沖區(老式的void*
),並且應該根據enum
字段的值將其轉換為一種類型。
使用std :: map時,您需要指定值類型。 如果要映射到不同類型的對象,我認為您有兩種可能性:
為該值定義一個基類並聲明一個
std::map<int, base_class_t *>
地圖,或者更好
std::map<int, shared_ptr<base_class_t>>
然后,您可以插入不同的對象,這些對象均源自base_class_t。
外部選項映射到聯合。 但是我不會那樣做;-)
我無法完全理解您的問題。我得到的是您想插入不同類型的值。 第一個鍵將包含該映射的另一個鍵所指向的另一個映射的“ int值”。 第二個鍵將包含一個普通整數。 如果是這種情況,為什么不在地圖內使用向量。
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
-object。 我建議重新考慮您的設計,以便您不需要任何類型的對象。
不,每種STL容器類型都需要精確的ONE類型。 為了您的想法,您需要一個可以容納多種類型的容器類型。 為此,您可以使用http://www.boost.org/doc/libs/1_58_0/doc/html/variant.html
我認為,可能是定義了一個參數的部分模板類可能是您的問題的答案。
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));
}
因此,無論您需要什么,您都可以使用預定義的第一個參數和第二個定義在函數中的相同類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.