我有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以群组方式执行此操作...(
答案 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
不允许您为搜索提供起点,因此您可以使用此功能实现自己的二叉搜索树。还有更多,最好的解决方案取决于数据集的大小,密钥的性质和其他因素。研究问题,选择一个或两个解决方案,实施,测试并在必要时进行迭代。