2015-03-13 48 views
3

如何使用string鍵創建std::map鍵和自定義值字段。std ::帶字符串鍵和自定義值字段的地圖

我下面想std::map

"Name" "abcd" 
"age" "50" 
"Address" "Street" "xxxx" 
      "PIN" "xxxx" 
      "District" "xxxx" 
"Gender" "Male" 

所以我所有的我,除了第三個領域是string,string類型。但該地址本身是另一張地圖,包含string string對。

如何在C++中創建這樣的地圖?

+0

您的值必須是能夠表示從字符串到字符串的字符串或映射的類型。 – Hurkyl 2015-03-13 08:05:45

+0

我認爲你應該將這個模型作爲一個類而不是地圖。 – Jens 2015-03-13 10:03:51

+0

你正在描述一個記錄a.k.a一個'struct'(或'class')而不是一張地圖。如果你真的需要一個映射,那麼你應該使用一個'std :: map ',例如使用來自Boost或Qt的變體。如果你認爲你需要一個地圖,你應該可以解釋爲什麼。最佳解決方案取決於您需要地圖的原因。 – 2015-03-13 12:10:30

回答

0

的你需要的映射鍵入可以存儲字符串或地圖的東西。一種方法是使用Boost.Variant

typedef boost::variant<std::string, std::map<std::string, std::string>> Value; 

typedef std::map<std::string, Value> TheMapYouWouldUse; 

閱讀我聯繫,以瞭解如何訪問值的文檔。

另一種方法是提供您自己的受限解決方案。也許像這樣(有點hacky):

class Value 
{ 
    std::map<std::string, std::string> values; 

public: 
    std::string& asString() 
    { return values[""]; } 

    std::map<std::string, std::string>& asMap() 
    { return value; } 
}; 

當然會調整接口,以適應您的實際需要。

0

很簡單。 您可以使用帶有矢量的地圖,其中矢量中的每個索引代表一個項目。

代碼沒有測試剛鍵入

std::map<std::string, std::vector<std::string>> items; 
items["Address"].push_back("xxxx") 

或者你可以使用地圖列表

std::map<std::string, std::list<std::string>> items; 
items["Address"].push_back("xxxx") 

,或者您可以使用地圖的地圖

std::map<std::string, std::map<std::string, std::string>> items; 
std::map<std::string, std::string> subItems; 
subItems.insert(std::pair<std::string, std::string>("Street", "xxxx"); 
subItems.insert(std::pair<std::string, std::string>("District", "xxxx"); 
items["Address"] = subItems; 
+0

感謝您的回答。如果我使用的是第一種方法,我把值「街道」(它實際上是價值「xxxx」)的關鍵。另外第二種方法(地圖的地圖)我如何添加名稱字段。它只有單一的價值。 – user2621310 2015-03-13 09:46:42

+0

選項一意味着街道是索引0,區域將是索引1,依此類推。 – user743414 2015-03-13 10:19:06

+0

@ user2621310你知道你正在重新實現'struct'嗎?我的意思是我見過一些固執的人試圖重新實現向量或字符串,但結構,這是第一個。 – 2015-03-13 12:14:58

0

而不是地圖,你應該創建一個代表你的人物對象的類。

enum class Gender 
{ 
male, 
female 
}; 

class ZipCode 
{ 
// ... 
}; 

class Address 
{ 
    Address(std::string const& s, std::string const& p, std::string const& d): 
    street(s), 
    pin(p), 
    district(d) 
    { 
    } 

private: 
    std::string street; 
    std::string pin; 
    std::string district; 
}; 

class Person 
{ 
public: 
    Person(std::string const& n, Gender d, Address const& a): 
    name(n), 
    gender(g), 
    address(a) 
    { 
    } 

    // now add methods operating on the data. 

private: 
    std::string name; 
    Gender gender; 
    Address address; 
}; 

不是隻用getter和setter創建一個類,而是嘗試爲方法找到合理的服務。儘量避免二傳手。

+0

小心解釋downvote?我認爲這是一個設計問題,而不是語言問題。 – Jens 2015-03-13 09:53:05