for (std::vector<const std::string>::const_iterator it = serverList.begin(); it != serverList.end(); it++)
{
// found a match, store the location
if (index == *it) // index is a string
{
indexResult.push_back(std::distance(serverList.begin(), it)); // std::vector<unsigned int>
}
}
我已经编写了上面的代码来查看字符串向量并返回另一个带有任何“命中”位置的向量。
有没有办法做同样的事情,但速度更快? (如果我在容器中有10,000件物品,则需要一段时间)。 请注意,我必须检查所有匹配的项目并将其位置存储在容器中。
Bonus Kudos:任何人都知道如何进行搜索,以便找到部分结果(例如:搜索“coolro”并存储变量“coolroomhere”的位置)
答案 0 :(得分:8)
在对矢量
进行排序后使用binary_searchlower_bound&amp; equal_range 搜索因为它是二进制是对数而不是你的搜索是O(N)
答案 1 :(得分:5)
基本上,你问是否可以检查a的所有元素 匹配,不检查所有元素。如果有某种外在的 元信息(例如,数据被分类),它可能是可能的(例如, 使用二进制搜索)。否则,就其本质而言,要检查所有 元素,你必须检查所有元素。
如果你要在列表和列表上做很多这样的搜索
如果没有变化,您可以考虑使用商品计算第二张表
条目的哈希码;再次取决于数据的类型
抬起头来,计算哈希码的效率会更高效
索引,并首先比较哈希码,只比较字符串
哈希码是相等的。这是否有所改善
取决于表的大小和其中的数据类型。你可能会
也能够利用关于字符串中数据的知识;如果
它们都是URL,例如,大部分以"http://www."
开头,
在第十个角色开始比较,只回到
比较前10个,如果所有其余的都相等,可能最终会变大
取胜。
关于查找子字符串,您可以使用std::search
元素:
for ( std::vector<std::string::const_iterator iter = serverList.begin();
iter != serverList.end();
++ iter ) {
if ( std::search( iter->begin(), iter->end(),
index.begin(), index.end() ) != iter->end() ) {
indexResult.push_back( iter - serverList.begin() );
}
}
取决于搜索的元素数量和长度 涉及的字符串,使用类似的东西可能更有效 但是,BM搜索会将搜索字符串预编译为必要的 在进入循环之前的表格。
答案 2 :(得分:2)
如果您将容器设为std::map
而不是std::vector
,则使用的基础数据结构将优化用于执行此类关键字搜索。
如果您改为使用std::multimap
,则成员函数equal_range()将返回一对覆盖地图中每个匹配的迭代器。听起来像你想要的那样。
下面的智能评论者指出,如果您实际上不存储任何信息而不是名称(搜索键),那么您应该使用std::multiset
。