| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Поиск в векторе |
| Автор: artsb 2.12.2007, 23:50 | ||
Уже, наверное, все видели эту структуру
Нужно организовать поиск слова или сочетания слов. Например, пользователь выбирает один из трёх вариантов в ComboBox'е (3 - количество переменных в структуре). Если выбран первый вариант, поиск будет проходить по переменным name в векторе. Но в ней может храниться предложение. Уф-ф-ф, надеюсь понятно объяснил. |
| Автор: Diamido 3.12.2007, 08:48 |
| Если выбрана 1-я галочка только в name идёт поиск, 1-я и 2-я в name и www Самый тривиальный способ решения: 1. Есть функция для поиска строки в подстроке, возвращает индекс где находиться первый символ искомой строки. (не помню как она называется str* вродебы) 2. Просто пишешь процедуру которая анализирует выбраные галочки и ищет по каждой строке, если найдено хоть одно совпадение возвращает индекс записи в струкруре. 3. Потов выводишь найденую структуру куда тебе надо и продолжаешь поиск если надо. |
| Автор: artsb 3.12.2007, 09:59 |
| Попробую объяснить ещё раз: В ComboBox'е юзверь выбирает один из вариантов, а в Edit вводит текст. Допустим он выбрал первый, тогда поиск должен идти по name. Как только будет найдено совпадение, поиск останавливается, а мне нужно получить индекс текущего элемента вектора. В принципе, всё это я смогу сделать, вопрос в следующем: Как сделать поиск если в Edit может быть введено слово или сочетание слов и в name может быть слово, а может предложение? |
| Автор: volvo877 3.12.2007, 12:56 |
| artsb, возможно это решается гораздо проще, но в свое время я реализовывал подобный поиск через так называемую "Levenshtein distance" - коэффициент "похожести" двух строк... Если похожесть очень высока, то строка считается найденной, и поиск останавливается... |
| Автор: xvr 3.12.2007, 15:53 | ||||
Делишь name и Edit на набор слов (например функцией strtok или через TStringList), затем сохраняешь их в map<AnsiString,int>, добавляя в map 1 для name и 2 для Edit. Если получится элемент с 3 - искомое пересечение найдено.
Но быстрее будет вариант с set<AnsiString> куда будут складываться слова из Edit (один раз) и затем проверяться на принадлежность этому множеству слова из name |
| Автор: artsb 3.12.2007, 19:21 | ||
А если так?
Так будет работать? А то я не проверял. |
| Автор: xvr 3.12.2007, 19:28 | ||||
Будет, но данные в поле ввода (Edit1) будут рассматриваться как слово, а не как набор слов. Кроме того, если в этих данных будет хоть один пробел, то ничего найдено не будет (вообще) |
| Автор: artsb 3.12.2007, 21:37 |
| xvr ты не мог бы отредактировать мой пример так, чтобы данные в Edit1 рассматривались как набор слов, если их там несколько. Как можно из строки удалить определённый символ? Например, из "Мама мыла раму" удалить все 'м'. |
| Автор: xvr 3.12.2007, 21:48 | ||||||||
Мог бы
Я правда не совсем понял зачем нужен был параметр flag, и зачем ты возвращал номер совпавшего слова (он кому то нужен)?
|
| Автор: xvr 4.12.2007, 15:19 | ||||||||
Не будет.
count возвращает количество элементов, заданных параметром, в set. Оно может быть 0 - set не содержит этого элемента, или 1 - set содержит данный элемент
Возвращается номер слова в фразе, а не номер элемента в ListBox'е (он там вообще не фигурирует) |
| Автор: artsb 4.12.2007, 20:38 |
| Всё понятно спасибо. Надо будет потом чуть-чуть доделать, ведь у меня поиск в векторе, а не в одной строке. |