W_A_S_A_B_I

error C2724

Feb 6th, 2023
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.87 KB | Source Code | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <set>
  4. #include <string>
  5. #include <utility>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. const int MAX_RESULT_DOCUMENT_COUNT = 5;    // Максимальное количество документов для вывода в результат
  11.  
  12.  
  13. // Прочесть строку с входного потока
  14. string ReadLine()
  15. {
  16.     string s;
  17.     getline(cin, s);
  18.     return s;
  19. }
  20.  
  21.  
  22. // Прочесть целочисленное значение с входного потока
  23. int ReadLineWithNumber()
  24. {
  25.     int result = 0;
  26.  
  27.     // Считать число из входного потока
  28.     cin >> result;
  29.  
  30.     // Считать символы возврата каретки и перевода строки
  31.     ReadLine();
  32.  
  33.     return result;
  34. }
  35.  
  36.  
  37. // Разделяет строку на слова
  38. vector<string> SplitIntoWords(const string& text)
  39. {
  40.     vector<string> words;
  41.  
  42.     string word;
  43.  
  44.     for (const char c : text)
  45.     {
  46.         if (c == ' ')
  47.         {
  48.             if (!word.empty())
  49.             {
  50.                 words.push_back(word);
  51.                 word.clear();
  52.             }
  53.         }
  54.         else
  55.         {
  56.             word += c;
  57.         }
  58.     }
  59.  
  60.     if (!word.empty())
  61.     {
  62.         words.push_back(word);
  63.     }
  64.  
  65.     return words;
  66. }
  67.  
  68.  
  69. // Формат данных, в котором поисковый сервер возвращает единицу результата поиска
  70. struct Document
  71. {
  72.     int id;
  73.     int relevance;
  74. };
  75.  
  76.  
  77. //
  78. bool HasDocumentGreaterRelevance(const Document& lhs, const Document& rhs)
  79. {
  80.     return lhs.relevance > rhs.relevance;
  81. }
  82.  
  83.  
  84. // Класс поискового сервера
  85. class SearchServer
  86. {
  87. private:
  88.  
  89.     // Структура документа
  90.     struct DocumentContent
  91.     {
  92.         int id = 0;             // Идентификатор докумена
  93.         vector<string> words;   // Вектор слов из которых состоит документ
  94.     };
  95.  
  96.     vector<DocumentContent> documents;  // Вектор документов
  97.     set<string> stop_words;             // Множество стоп-слов
  98.  
  99. private:
  100.     // Разделяет строку на слова исключая стоп-слова
  101.     vector<string> SplitIntoWordsNoStop(const string& text);
  102.  
  103.     // Находит все документы подходящие под запрос
  104.     vector<Document> FindAllDocuments(const set<string>& query_words);
  105.  
  106.     // Выдаёт соответствующую запросу релевантность документа
  107.     static int MatchDocument(const DocumentContent& content, const set<string>& query_words);
  108.  
  109.     // Распарсить запрос
  110.     set<string> ParseQuery(const string& text);
  111.  
  112. public:
  113.  
  114.     // Добавляет стоп-слова в поле stop_words
  115.     void SetStopWords(const string& text);
  116.  
  117.     // Добавляет новый документ в вектор
  118.     void AddDocument(int document_id, const string& document);
  119.  
  120.     // Выдаёт "топ" документов
  121.     vector<Document> FindTopDocuments(const string& raw_query);
  122. };
  123.  
  124. set<string> SearchServer::ParseQuery(const string& text)
  125. {
  126.     set<string> query_words;
  127.  
  128.     for (const string& word : SplitIntoWordsNoStop(text))
  129.     {
  130.         query_words.insert(word);
  131.     }
  132.  
  133.     return query_words;
  134. }
  135.  
  136.  
  137. void SearchServer::SetStopWords(const string& text)
  138. {
  139.     for (const string& word : SplitIntoWords(text))
  140.     {
  141.         stop_words.insert(word);
  142.     }
  143. }
  144.  
  145.  
  146. // Добавляет новый документ в вектор
  147. void SearchServer::AddDocument(int document_id, const string& document)
  148. {
  149.     const vector<string> words = SplitIntoWordsNoStop(document);
  150.  
  151.     documents.push_back({ document_id, words });
  152. }
  153.  
  154.  
  155. // Разделяет строку на слова исключая стоп-слова
  156. vector<string> SearchServer::SplitIntoWordsNoStop(const string& text)
  157. {
  158.     vector<string> words;
  159.  
  160.     for (const string& word : SplitIntoWords(text))
  161.     {
  162.         if (stop_words.count(word) == 0)
  163.         {
  164.             words.push_back(word);
  165.         }
  166.     }
  167.  
  168.     return words;
  169. }
  170.  
  171.  
  172. // Выдаёт "топ" документов
  173. vector<Document> SearchServer::FindTopDocuments(const string& raw_query)
  174. {
  175.     const set<string> query_words = ParseQuery(raw_query);
  176.  
  177.     auto matched_documents = FindAllDocuments(query_words);
  178.  
  179.     sort(matched_documents.begin(), matched_documents.end(), HasDocumentGreaterRelevance);
  180.  
  181.     if (matched_documents.size() > MAX_RESULT_DOCUMENT_COUNT)
  182.     {
  183.         matched_documents.resize(MAX_RESULT_DOCUMENT_COUNT);
  184.     }
  185.  
  186.     return matched_documents;
  187. }
  188.  
  189.  
  190. // Находит все документы подходящие под строку запроса
  191. vector<Document> SearchServer::FindAllDocuments(const set<string>& query_words)
  192. {
  193.     vector<Document> matched_documents; // Соответствующие документы
  194.  
  195.     // Цикл по всем документам
  196.     for (const auto& document : documents)
  197.     {
  198.         // Получение релевантности для текущего документа
  199.         const int relevance = MatchDocument(document, query_words);
  200.  
  201.         if (relevance > 0)
  202.         {
  203.             matched_documents.push_back({ document.id, relevance });
  204.         }
  205.     }
  206.  
  207.     return matched_documents;
  208. }
  209.  
  210. // Создает экземпляр класса поискового сервера с инициализацией
  211. SearchServer CreateSearchServer()
  212. {
  213.     SearchServer search_server; // Создает экземпляр класса
  214.  
  215.     // Считать и записать стоп-слова
  216.     search_server.SetStopWords(ReadLine());
  217.  
  218.     // Считать кол-во документов
  219.     const int document_count = ReadLineWithNumber();
  220.  
  221.     // В цикле считать и записать документы
  222.     for (int document_id = 0; document_id < document_count; ++document_id)
  223.     {
  224.         search_server.AddDocument(document_id, ReadLine());
  225.     }
  226.  
  227.     return search_server;
  228. }
  229.  
  230.  
  231. // Выдаёт соответствующую запросу релевантность документа
  232. static int SearchServer::MatchDocument(const DocumentContent& content, const set<string>& query_words)
  233. {
  234.     // Проверка на пустые входные данные (пустую строку запроса)
  235.     if (query_words.empty())
  236.     {
  237.         return 0;
  238.     }
  239.  
  240.     set<string> matched_words; // Здесь будем хранить множество совпавших слов
  241.  
  242.     // Цикл по словам документа
  243.     for (const string& word : content.words)
  244.     {
  245.         // Исключить повторяющиеся слова
  246.         if (matched_words.count(word) != 0)
  247.         {
  248.             continue;
  249.         }
  250.  
  251.         // Если слово из документа совпало с одним из слов в запросе
  252.         if (query_words.count(word) != 0)
  253.         {
  254.             // Добавить совпавшее слово
  255.             matched_words.insert(word);
  256.         }
  257.     }
  258.  
  259.     // Возвращаем количество совпадений
  260.     return static_cast<int>(matched_words.size());
  261. }
  262.  
  263.  
  264. //
  265. int main()
  266. {
  267.     // Создаём экземпляр поискового сервера
  268.     SearchServer search_server = CreateSearchServer();
  269.  
  270.     // Считываем строку запроса
  271.     const string query = ReadLine();
  272.  
  273.     // Находим и выводим релевантные документы
  274.     for ( auto[document_id, relevance] : search_server.FindTopDocuments(query) )
  275.     {
  276.         cout << "{ document_id = "s << document_id << ", relevance = "s << relevance << " }"s << endl;
  277.     }
  278.  
  279.     return 0;
  280. }
Advertisement
Add Comment
Please, Sign In to add comment