如何找到与键向量对应的所有元素
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.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
不允许您提供搜索的起点,您可以使用此功能实现自己的二叉搜索树。
还有更多,最佳解决方案取决于数据集的大小、键的性质和其他因素。研究问题,选择一个或两个解决方案,实施它,测试它,并在必要时迭代。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++:如何循环通过向量中的整数元素
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 不允许在向量中添加更多元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用并行参数向量调用元素向量的成员函数
- C++ 查找字符串中存在的元素向量
- 包含 std::threads 的元素向量
- 避免从单一元素向量转换为基元类型
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 如何为对元素(向量和int)配对创建unique_ptr也是unique_ptr
- 元素向量乘法 C++(代码不起作用)
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 遍历结构元素向量
- 犰狳C++中的元素向量或矩阵乘法
- 为什么'std::vector<int> b{2};'创建 1 元素向量,而不是 2 元素向量?
- 可移动元素向量的大小调整是否有效?
- 唯一元素向量的c++模板函数
- 获取索引和元素-向量问题
- 定义一个生成元素向量的函数时,正确的方法是什么?