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

How to find all elements that correspond to a vector of keys?

本文关键字:元素 向量 何找      更新时间:2023-10-16

我有一个std::vector<std::string> k;,其中的键值是我要查找的。我有一个要搜索的std::map<std::string, void*> table;。我想获得k中所有键的值的std::vector<void*> v;(如果这些值存在于table中,则不是所有键都可以在table中呈现,这一事实对我来说并不重要,而可能有比k中更多的键这一事实很重要)。如何找到与键对应的所有值?

对于k中的每个元素使用table.find(k_element)table[k_element]似乎是一种非常糟糕的方式来做到这一点,我也找不到STL中可以以组方式做到这一点的任何算法…(

使用table[k_element]或table.find(k_element)查找k中的每个元素似乎是一个非常糟糕的方法

我不知道为什么这感觉像一个坏的方式。即使STL中有一个算法可以为你做这件事,它也必须迭代k中的每个值——没有比线性时间更快的解决方案。我想有时人们认为一行代码总是比一个循环快,即使这一行代码调用了一个包含循环的函数。

有一些方法可以在一行中使用lambdas, map等来实现这一点,但这并不是"更好"或更快,只是可读性较差。

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

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

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