2011-03-30 53 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

相關問題