C/C++

Помогите пожалуйста доработать код, язык С++

Представьте, что анализируете запросы пользователей в вашей поисковой системе. Есть слова запроса и описание животного. Посчитайте релевантность запроса — размер множества слов, которые входят и в запрос, и в описание. Для этого доработайте функцию CalculateSimilarity из заготовки кода так, чтобы она вернула релевантность. Сначала вводится строка-запрос, затем с новой строчки строка-описание. Выведите единственное целое число — размер пересечения множеств слов из запроса и описания.

при вводе последнего условия выдаётся 3, а должно 2.

3 условие
small starling
small black starling with small brown eyes
 #include  
#include
#include
#include
using namespace std;

int CalculateSimilarity(vector first, vector second) {
// верните размер пересечения множеств слов
set st;
for(int i =0; i < first.size();i++)
{
st.insert(first[i]);
}
for(int i =0; i < second.size();i++)
{
st.insert(second[i]);
}
return first.size()+second.size()-st.size();
}

vector SplitIntoWords(string text) {
vector words;
string word;
for (int i = 0; i < text.size(); ++i) {
if (text[i] == ' ') {
words.push_back(word);
word = "";
} else {
word += text[i];
}
}
words.push_back(word);
return words;
}

int main() {
string query, description;
getline(cin, query);
getline(cin, description);

cout
У вас кривая функция разложения на слова.
Она добавляет одно пустое слово в конце.
 vector SplitIntoWords(const string& query)   
{
vector words;
string word;

for (int i = 0; i < query.size(); ++i)
{
if (query[i] == ' ')
{
if (word.size()) //для избежания добавления пустых слов
{
words.push_back(word);
word.clear();
}
continue; //чтобы пробел не записывался в слово
}
word += query[i];
}
if(word.size()) words.push_back(word);

return words;
}
БС
Байков Сергей
51 416
Лучший ответ
Николай Батрунов
 //  Функция выделяет слово word из строки s начиная с позиции pos
// Возможна генерация исключения std::bad_alloc
// Возвращает индекс начала следующего поля или std::string::npos
// если выделять больше нечего
size_t get_word( const std::string& s, std::string& word, size_t pos )
{
size_t idx;
size_t start_idx;
const char* delim = " \t";
word.clear();
idx = s.find_first_not_of( delim, pos );
if( idx != std::string::npos )
{
start_idx = idx;
idx = s.find_first_of( delim, idx );
if( idx == std::string::npos )
{
word.assign( s, start_idx, s.length()-start_idx );
}
else
{
word.assign( s, start_idx, idx-start_idx );
}
}
return idx;
}
Николай Батрунов
 int main( int argc, char* argv[] ) 
{
std::string str("\tслово_1 слово_2 слово_3");
std::string word;
size_t pos = 0;
while( pos != std::string::npos )
{
pos = get_word( str, word, pos );
std::cout
Николай Батрунов Передавать в функцию вектора по значению, как у автора вопроса и первых двух отписавшихся - тут попахивает ChatGPT или аналогичным искусственным идиотизмом.
Владимир Колтунцев попытался интегрировать.. получаю ошбки, так что непонятненько. как я понял ошибка происходит из за 2 повторов во второй строке. др. словами надо избавиться сначала от повторов, затем сравнивать.
Для решения данной задачи необходимо найти пересечение множеств слов в запросе и описании животного. Для этого можно создать два отдельных множества для слов в запросе и описании, а затем использовать функцию set_intersection из STL для нахождения пересечения.

Вот доработанный код функции CalculateSimilarity:
 int CalculateSimilarity(vector first, vector second) { 
set first_set(first.begin(), first.end()); // создание множества слов из первого вектора
set second_set(second.begin(), second.end()); // создание множества слов из второго вектора
vector intersection; // создание вектора для хранения пересечения множеств

// нахождение пересечения множеств
set_intersection(first_set.begin(), first_set.end(), second_set.begin(), second_set.end(), back_inserter(intersection));

return intersection.size(); // возвращаем размер пересечения
}
Пример использования:
 string query = "small starling"; 
string description = "small black starling with small brown eyes";
cout
Владимир Колтунцев попытался интегрировать.. получаю ошбки, так что непонятненько. как я понял ошибка происходит из за 2 повторов во второй строке. др. словами надо избавиться сначала от повторов, затем сравнивать.
#include <iostream>
#include <vector>
#include <string>
#include <set>
using namespace std;

int CalculateSimilarity(vector<string> first, vector<string> second) {
// верните размер пересечения множеств слов
set<string> st1(first.begin(), first.end());
set<string> st2(second.begin(), second.end());
int intersection_size = 0;
for (const auto& word : st1) {
if (st2.count(word) > 0) {
intersection_size++;
}
}
return intersection_size;
}

vector<string> SplitIntoWords(string text) {
vector<string> words;
string word;
for (int i = 0; i < text.size(); ++i) {
if (text[i] == ' ') {
words.push_back(word);
word = "";
} else {
word += text[i];
}
}
words.push_back(word);
return words;
}

int main() {
string query, description;
getline(cin, query);
getline(cin, description);

cout << CalculateSimilarity(SplitIntoWords(query), SplitIntoWords(description)) << endl;
return 0;
}
Владимир Колтунцев неработает. даваемый пример так же не определяется.