2011-03-30 64 views
11

检查字符串的stl向量是否包含 特定字符串的最有效方法是什么?检查字符串是否作为向量中的元素存在

+1

如果检查你的货柜物品的存在是你计划不得不经常做的事情,你可能要考虑使用一个std ::设置,而不是当然,你不想重复的(提供您的设置中的字符串)。 std :: set有一个find()方法,其平均复杂度保证为log(n)。 – Fred 2011-03-30 17:25:26

回答

19

明显但可能过于缓慢的解决方案是std::find(vec.begin(), vec.end(), your_string);

如果你的载体没有太大变化,但排序第一,然后用binary_searchlower_boundupper_bound,或equal_range。如果您的矢量变化很大,请考虑使用set/multiset(或者如果需要,请使用map/multimap)。

根据您的需要,散列(unordered_set)可能也适合,但它与您的初始容器选择比正常排序的容器更大的不同,并且不在C++ 0x之前提供(您可以轻松获得它)。

+0

或者'multiset'如果该值可能存在多次。 – Will 2011-03-30 17:24:49

+0

速度更快的可能是散列表或前缀树(又名trie)。前者或多或少是标准的:C++ 0x中的'unordered_set'(Boost中也可用)或老派STL中的'hash_set'。你可能需要编写你自己的版本,或者寻找一个好的实现。 – 2011-03-30 17:29:39

0

使用std :: find查找字符串。

std::find(stringVector.begin(), stringVector.end(), "specificStringToFind") ; 
3
vector<string> v; 
vector<string>::iterator it; 
it = std::find(v.begin(), v.end(), "stringToFind"); 
8

使用std::find找到目标字符串。这是一个线性搜索,所以要小心搜索大型矢量。

要了解向量包含目标与否,使用:

bool isPresent = (std::find(vec.begin(), vec.end(), target) != vec.end()); 
4

这里是一个C++ 11的替代:

#include<functional> 
#include<vector> 
#include<string> 

std::vector<std::string> v; 
bool elementFound = std::any_of(v.begin(), v.end(), [](std::string const& s) {return s=="string-to-search";}); 

随意调整lambda函数是什么你想,例如

[](std::string const& s) {return s.size()>3;} 
+0

STL中有一些特定的算法。为什么在有更好的选择时使用通用lamda? – MatthiasB 2014-09-01 11:41:52

+0

因为(i)如前所述,它是可扩展的,(ii)获得一个bool比提问迭代器好得多,(iii)它是另一个可以表示同一概念的4个答案的替代方案......我没有说是最有效的一个。 – davidhigh 2014-09-01 11:45:04

+0

好的,我刚刚意识到这个问题明确要求效率。如上所述,我不知道它与'std :: find'相比的表现如何,但它仍然有用。 – davidhigh 2014-09-01 11:52:51

相关问题