如何找到与键向量对应的所有元素?

时间:2015-06-02 01:50:28

标签: c++ algorithm c++11 dictionary stl

我有std::vector<std::string> k;我想要的巫婆的键值。我搜索了std::map<std::string, void*> table;。我想为std::vector<void*> v;中的所有密钥获取k个值(如果table中存在此类值,而不是所有密钥可以在table中显示,这个事实对我来说并不重要,而事实上可能有比k更多的键很重要。如何找到与键对应的所有值?

table[k_element]中的每个元素table.find(k_element)使用k似乎是一种非常糟糕的方式,我也无法find any algorithm in STL以群组方式执行此操作...(

2 个答案:

答案 0 :(得分:3)

  

对k中的每个元素使用表[k_element]或table.find(k_element)似乎是一种非常糟糕的方式

我不确定为什么感觉这是一种糟糕的方式。即使STL中有一个算法为你做这个,它也必须遍历k中的每个值 - 这个问题不是解决这个问题的问题。比线性时间快。我认为有时候人们认为一行代码总是比循环更快,即使这一行代码调用一个包含循环的函数。

有一些方法可以与lambdas,map等一起完成这项工作,但这不是&#34;更好&#34;或更快,只是不太可读。

答案 1 :(得分:0)

您的问题有不同的解决方案,其中一些:

  • k中的所有密钥放入unordered_set,遍历表格并查找集合中的每个密钥,您将获得O(n)。您可以考虑更改表,以便在连续内存中存储元素的数据结构(可能是使用池分配器的映射或窗帘后面带有std::vector的数据结构),这样算法将更加缓存友好(因此,可能相当快得多),尽管这种数据结构的插入时间会很慢。
  • k进行迭代并查找表格中的每个键,您将获得O(k*log(n)),如果您更改unordered_map的表格,则可以获得O(k)。虽然,您必须考虑到计算字符串的哈希值可能非常慢,但有时比较好地比较字符串并具有查找的日志时间,而不是计算键的哈希值并且具有查找的恒定时间。选择取决于键的扩展和性质。
  • 您可以对k中的元素进行排序并迭代有序集,在每次查找后,您将知道下一次搜索的起点,因此每次查找都会比前一次查找更快。由于std::map不允许您为搜索提供起点,因此您可以使用此功能实现自己的二叉搜索树。

还有更多,最好的解决方案取决于数据集的大小,密钥的性质和其他因素。研究问题,选择一个或两个解决方案,实施,测试并在必要时进行迭代。