2017-05-26 35 views
0

我需要單個字符串映射到多個字符串,要做到這一點我考慮兩種不同的溶液:地圖串矢量或不同的鍵映射到一個值

首先是每個串映射到載體中,從而當我看着鑰匙時,我得到了向量。 std::unordered_map<std::string, std::vector<std::string>>
使用此解決方案意味着我只需要查找一次密鑰,但隨後我必須對數組進行迭代以找到我需要的正確字符串。

我認爲第二個解決方案是使用包含在向量每個字符串(我知道,他們是唯一的)爲重點,並將它們映射到什麼會一直在溶液中1 std::unordered_map<std::string, std::string>
關鍵使用該解決方案的手段我需要查找一個關鍵n次(其中n是解決方案1中數組的長度),並且在我的映射中,我對許多關鍵字都有相同的值(我不知道最後的重要性),但是我會直接有我需要的字符串。

例1:

std::unordered_map<std::string, std::vector<std::string>> map; 
std::vector<std::string> arr = {"hello", "world"}; 
map["greetings"] = array; 

例2:

對於我的程序的目的並不重要我有什麼字符串中的端部(從溶液數組的值1或來自解決方案2的值),只要我有辦法將它們映射到對方,這樣兩種解決方案都是可行的。 我沒有辦法事先知道解決方案1中陣列的長度。

這兩種解決方案有什麼重大區別嗎?哪一個會更快/在紙上使用更少的內存?

+1

我很困惑你的問題,因爲映射方向相反。你的意見是什麼:「問候」或「你好」和「世界」?或者你需要能夠映射兩種方式? – Angew

+3

'std :: unordered_multimap'呢? – max66

+0

@Angew如果輸入是'''''''''''''''''''''''''''''''''「hello」和「world」'''''''''''''',我只需要讓它們互相「連接」 。對的向量也可以工作,但是然後我需要重複以找到正確的一個,並且我無法承受那個時間 –

回答

2

您有一個串和串序列(或者一組字符串之間的映射中,如果插入順序ISN」 t顯着)。讓我們稱之爲先前的鍵和後面的值,儘管你的第二個例子以相反的方式使用它們。

示例1允許您高效地查找與特定鍵相關的所有值。因此,接近一個更快,接近兩個更慢。

示例二允許您高效地找到特定值映射到的鍵。因此,方法二更快,接近更慢。

正如你可以看到兩個例子都比另一個更快。

+0

那麼,你在技術上回答了我的問題,哪一個更快,讓我意識到我的錯誤,所以我想你的答案是最正確的 –

0

你的兩個選擇可以做不同的事情。

例1:

std::unordered_map<std::string, std::vector<std::string>> map; 
map["greetings"] = {"hello", "world"}; 
map["farewells"] = {"goodbye", "cruel", "world"}; 
for(auto && pair : map) { 
    for(auto && value : pair.second) { 
     std::cout << pair.first << value; 
    } 
} 

// greetings hello 
// greetings world 
// farewells goodbye 
// farewells cruel 
// farewells world 

例2:

std::unordered_map<std::string, std::string> map; 
map["hello"] = "greetings"; 
map["world"] = "greetings"; 
map["goodbye"] = "farewells"; 
map["cruel"] = "farewells"; 
map["world"] = "farewells"; 
for(auto && pair : map) { 
    std::cout << pair.second << pair.first; 
} 

// greetings hello 
// farewells goodbye 
// farewells cruel 
// farewells world 
+0

是的,但我知道所有的字符串都是獨一無二的,因此我絕對不會像第二個例子中那樣覆蓋鍵值。 I.E.一旦''''世界'''映射到'''「問候」'''我知道我肯定不會'''映射[「世界」] =「告別」;'''永遠 –

+0

它是一個雙向關係嗎?看一看http://www.boost.org/doc/libs/1_64_0/libs/bimap/doc/html/index.html – Caleth

+0

具體'boost :: bimap ,boost: :bimap :: unordered_non_unique >'似乎符合你的要求 – Caleth