2015-12-15 4 views
0

У меня есть вектор строки, и я хочу вернуть строку из вектора, которая похожа на строку.Найти строку в векторе в C++

Например, вектор содержит: «load», «fox», «google», «firefox», а строка: «mozilla firefox». Истинный результат в этом примере - «firefox».

Я использую следующий код, но это неправильно и возвращает «лиса» для моего образца.

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

Вы только проверяете, является ли строка внутри вектора частью искомой строки. поэтому ваше состояние недостаточно конкретное. – Zaiborg

+2

Оба '" fox "и' "firefox" 'находятся в' 'mozilla firefox''. Вам нужны дополнительные критерии для выбора «firefox» и игнорировать «лиса». –

ответ

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.