C++
Как написать простой поисковик на C++
Простой поисковик на C++ можно сделать так: хранить список текстов в std::vector<std::string>, приводить запрос и документы к одному регистру, искать подстроку через find и выводить найденные строки. Это не Google и не полнотекстовый индекс, но хороший первый проект для строк, циклов и функций
Минимальный пример
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
std::string toLower(std::string text) {
std::transform(text.begin(), text.end(), text.begin(),
[](unsigned char c) { return std::tolower(c); });
return text;
}
int main() {
std::vector<std::string> documents {
"C++ string find example",
"Visual Studio Code setup",
"How to read file in C++"
};
std::string query;
std::cout << "Search: ";
std::getline(std::cin, query);
std::string normalizedQuery = toLower(query);
for (const std::string& document : documents) {
std::string normalizedDocument = toLower(document);
if (normalizedDocument.find(normalizedQuery) != std::string::npos) {
std::cout << document << '\n';
}
}
}
Если ввести code, программа найдет строку Visual Studio Code setup
Как работает find
document.find(query) ищет подстроку. Если подстрока найдена, возвращается позиция. Если не найдена, возвращается std::string::npos
Проверка выглядит так:
if (text.find(word) != std::string::npos) {
std::cout << "found\n";
}
Для новичка это самый простой способ сделать поиск по строке
Зачем нужен lower-case
Без приведения к нижнему регистру запрос code не совпадет с Code, если сравнение чувствительно к регистру. Поэтому мы приводим и запрос, и документ к одному виду. Исходный документ при этом выводим как был, чтобы не портить текст
Для русского текста тема сложнее: кодировки, локаль и Unicode требуют отдельной обработки. Для первого проекта лучше проверить английские строки, а потом отдельно изучить русскоязычный ввод
Как улучшить проект
Следующий шаг — хранить не просто строки, а структуру:
struct Document {
int id;
std::string title;
std::string text;
};
Тогда можно искать по заголовку и тексту, а выводить id и title. Еще один шаг — читать документы из файла, а не держать их в коде
Как вывести номер результата
Чтобы пользователь понимал, что найдено, выводите номер документа:
for (std::size_t i = 0; i < documents.size(); ++i) {
std::string normalizedDocument = toLower(documents[i]);
if (normalizedDocument.find(normalizedQuery) != std::string::npos) {
std::cout << "#" << i << ": " << documents[i] << '\n';
}
}
std::size_t подходит для индексов контейнеров. Так результат можно использовать дальше: открыть документ, показать подробности или сохранить id найденной строки
Что считать поисковиком
Такой пример ищет только подстроку. Он не понимает формы слов, опечатки, синонимы и релевантность. Но это нормальный первый шаг: вы уже получаете ввод, проходите коллекцию, сравниваете строки и выводите результаты. Дальше можно добавить разбиение на слова, подсчет совпадений, чтение файлов и простой индекс слово -> список документов
Если запрос пустой, лучше не показывать все документы подряд:
if (normalizedQuery.empty()) {
std::cout << "Empty query\n";
return 0;
}
Такая проверка делает поведение программы предсказуемым
Еще полезно вывести количество совпадений. Тогда пользователь видит не только сами строки, но и итог: найдено 0, 2 или 10 документов
Частые ошибки
Первая ошибка — сравнивать строки через ==, хотя нужен поиск внутри текста. Вторая — забыть std::string::npos. Третья — не нормализовать регистр. Четвертая — ждать от find морфологию, исправление опечаток и поиск по словам. Простой find ищет ровную подстроку
Мини-задача: добавьте пять документов, запрос через getline, счетчик найденных результатов и сообщение Ничего не найдено, если совпадений нет
Что почитать дальше по C++
Что почитать дальше по C++
Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:
- Как сделать интерфейс в приложении на C++: простой вариант с меню
- C++ с нуля: первый файл, переменные и вывод
- Enter в C++: перенос строки, std::endl и ввод через cin
- Microsoft Visual C++ 14.0: что это, зачем нужен и как исправить ошибку установки