簡體   English   中英

有沒有一種方法std :: map不聲明值類型

[英]Is there a way to have a std::map without declare the value type

我需要一個std::map容器,例如:

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

  1. "a1"的值是另一個std::map ,但鍵"a2"的值是整數。 在這種情況下,如何聲明地圖?

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

謝謝。

不,您不能立即執行此操作。 考慮使用某種類型擦除設備,它們應該是類型安全的並且易於理解,例如boost::variantboost::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM