2015-12-15 65 views
0

我有一個字符串向量,我想從類似於字符串的向量中返回一個字符串。例如,向量包含:「load」,「fox」,「google」,「firefox」,字符串是:「mozilla firefox」。此示例中的真實結果是「firefox」。在C++中查找向量中的字符串

我使用下面的代碼,但它是錯誤的,並返回我的示例「狐狸」。

vector<string>::const_iterator it_found = find_if(MyVector.begin(), MyVector.end(), [&MyString](string s) -> bool 
{ return(MyString.find(s) != string::npos); }); 

if(it_found != MyVector.end()) 
{ 
    //Do Somthing 
} 

我該怎麼辦?

+1

您只檢查'vector中的字符串'是否爲搜索字符串的一部分。所以你的條件不夠具體 – Zaiborg

+2

「'fox」'和''firefox「'在''mozilla firefox」'中。你需要額外的標準來選擇'「firefox」'而忽略'「fox」'。 –

回答

3

您正在返回第一個字符串,它是您的搜索字詞的子字符串。看來你想要最好的匹配,所以需要更復雜的方法。您可以計算出一些得分,並找到能夠給出最高得分的元素,例如與std::max_element

得分可能只是匹配的子字符串的長度或更復雜的東西,如果您稍後改進您的匹配算法。

1

您可以使用此實現split將空白字符分割爲輸入字符串,並返回std::vector<std::string>

std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input); 
    std::vector<std::string> ret((std::istream_iterator<std::string>(buffer)), 
           std::istream_iterator<std::string>()); 
    return ret; 
} 

然後,每串MyVector與來自split返回矢量候選人進行比較。

std::string MyString = "mozzilla firefox"; 
std::vector<std::string> MyVector = {"fire", "fox", "firefox", "mozilla"}; 
auto candidates = split(MyString); 
auto it_found = std::find_if(MyVector.begin(), MyVector.end(), [&candidates](std::string s) -> bool{ 
    return (std::find(candidates.begin(), candidates.end(), s) != candidates.end()); 
}); 

if(it_found != MyVector.end()){ 
    std::cout<<"\nFound : "<<*it_found; 
} 

輸出:

Found : firefox 

注意,這隻能找到字符串的第一場比賽中MyVector與在candidates的字符串。