地图串矢量或不同的键映射到一个值

问题描述:

我需要单个字符串映射到多个字符串,要做到这一点我考虑两种不同的溶液:地图串矢量或不同的键映射到一个值

首先是每个串映射到载体中,从而当我看着钥匙时,我得到了向量。 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”'''''''''''''',我只需要让它们互相“连接” 。对的向量也可以工作,但是然后我需要重复以找到正确的一个,并且我无法承受那个时间 –

您有一个串和串序列(或者一组字符串之间的映射中,如果插入顺序ISN” t显着)。让我们称之为先前的键和后面的值,尽管你的第二个例子以相反的方式使用它们。

示例1允许您高效地查找与特定键相关的所有值。因此,接近一个更快,接近两个更慢。

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

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

+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 <:string>>'似乎符合你的要求 – Caleth