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

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

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

k 中的每个元素使用 table[k_element]table.find(k_element) 似乎是一种非常糟糕的方法,我也不能 find any algorithm in STL分组方式...(

using table[k_element] or table.find(k_element) for each element in k seems like a really bad way

我不确定为什么这感觉很糟糕。即使 STL 中有算法可以为您执行此操作,它也必须遍历 k 中的每个值——对于这个问题,没有比线性时间更快的解决方案。我认为有时人们认为一行代码总是比循环快,即使那一行代码调用了一个包含循环的函数。

有很多方法可以在 lambda、map 等行中执行此操作,但这不是 "better" 或更快,只是可读性较差。

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

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

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