我需要創建鍵/值對的這樣一個集合:收集INT /字符串[]用一行代碼爲每個插入
map<const int, string[]> myMap; // psuedo code
什麼是要去了解它的最好方法是什麼?
有沒有辦法做到這一點,我可以在一行中初始化它像:
myMap.Insert(1, new string[]{ "stack", "is", "awesome" }); // pseudo code
我需要創建鍵/值對的這樣一個集合:收集INT /字符串[]用一行代碼爲每個插入
map<const int, string[]> myMap; // psuedo code
什麼是要去了解它的最好方法是什麼?
有沒有辦法做到這一點,我可以在一行中初始化它像:
myMap.Insert(1, new string[]{ "stack", "is", "awesome" }); // pseudo code
假設你決定要堅持大致您目前使用的結構(與int
爲重點和string
S作爲關聯值的集合),你可能想使用std::vector<std::string>
作爲值,所以你map
就像定義:
std::map<int, std::vector<std::string> > mymap;
在這種情況下,它可能是最容易使用陣列狀的符號做你插入:
mymap[1] = {"String", "is", "awesome"};
就目前來看,這取決於使用C++ 11支撐初始化器列表。這將與最新的編譯器(例如,gcc 4.7.0)一起工作,但許多較舊的編譯器未能與C++ 11保持一致(例如,VC++ 10,VC++ 11 beta)。
您是對的。這正是我期待的。不幸的是,它在vs2010中沒有提供atm。但由於它基本上將在不久的將來工作,我會將其標記爲答案。 至於我目前的問題去了,我解決了這個問題通過創建一個返回的矢量
可以使用效用函數make_pair。
myMap.insert(make_pair(1,"stack"));
不知道你爲什麼會需要一個string []
,您可以通過一個唯一的密鑰吹罰多個字符串不是選擇std::map
的目的是什麼?爲什麼你需要一個數組,然後std::map
已經提供。
如果value是一個字符串[],該怎麼辦? –
哦,你的意思是像每個鍵有多個值? –
@PrivateVoid:每個鍵的多個值是[** std :: multimap **](http://www.cplusplus.com/reference/stl/multimap/)爲您提供的。如果這是需求,爲什麼不使用'std :: multimap'。 –
如果您不在乎您是更換還是隻創建operator[]
。
std::map<int, std::string> mymap;
mymap[1] = "stack is awesome";
並且不要在地圖中使用指針。或者使用std::multimap
作爲具有相同密鑰的多個元素。
例與std::multimap
:
int main() {
std::multimap<int, std::string> mymmap{{1, "stack"},
{1, "is"},
{1, "awesome"}};
auto range = mymmap.equal_range(1);
for (auto i = range.first; i != range.second; ++i)
{
std::cout << (*i).second << std::endl;
}
}
這就是爲什麼它標記爲僞代碼 –
@PrivateVoid:'map
感謝您的反饋,爲清晰起見進行了編輯 –
你應該看一看的std :: multimap中,它可能更適合您的用例:
multimap<int, string> mm;
它一樣,但它可以容納多個值相同的鍵映射。這通常由一個二叉樹來實現,它不會強制唯一性。
http://en.cppreference.com/w/cpp/container/multimap
或者你可以使用:
map<int, vector<string>> m;
可以初始化這樣的:
map<int, vector<string>> m {
{ 1, { "stack", "is", "awesome" } },
{ 42, { "foo", "bar", "baz" } }
};
你爲什麼要使用'string'陣列(這實際上是一個'string'指針,在這裏)?爲什麼不使用'vector'而避免'new'? –
謝謝,那是我忽視的一點。我現在會研究它。 –
@JonathanGrynspan:代碼[甚至沒有編譯](http://ideone.com/pOh4S)。 –