Алгоритм accumulate для сложения строк
Подскажите, как решить такую задачу: Напишите функцию, которая принимает строку-запрос и множество стоп-слов и возвращает новую строку. В новой строке после запроса идут стоп-слова через пробел, перед каждым стоит дефис. Для этого нужно передать в accumulate четвёртым аргументом функцию, которая сворачивает множество стоп-слов в требуемый формат. Мой код не работает:
#include <set>
#include <string>
#include <numeric>
using namespace std;
string DushStopWords(string dush, string word) {
dush = "-"s;
return dush + word;
}
string AddStopWords(const string& query, const set<string>& stop_words) {
string result = accumulate(stop_words.begin(), stop_words.end(), query, DushStopWords);
return result;
}
Что делаю не так?
Ответы (2 шт):
Ну просто вы немного неправильно написали. Вам нужно чтобы к значению dush прибавлялось значение word после тире и возвращалась итоговая строка.
string DushStopWords(string dush, string word)
{
return dush + " -" + word;
}
// или так
string DushStopWords(string dush, string word)
{
return std::move(dush) + " -" + word;
}
Проверочный код
string DushStopWords(string dush, string word)
{
return std::move(dush) + " -" + word;
}
string AddStopWords(const string& query, const set<string>& stop_words)
{
return accumulate(stop_words.begin(), stop_words.end(), query, DushStopWords);
}
int main()
{
set<string> stop_words{ "in", "with", "on", "if", "and"};
string query{"Help find error:"};
cout << AddStopWords( query, stop_words);
return 0;
}
Благодаря помощи @DmitryK удалось понять, что моя ошибка в коде заключалась в неправильном понимании работы алгоритма accumulate в общем случае, когда используется 4 аргумента, причем в качестве 4-го аргумента задействуется функция, которая должна указывать на используемую в данном случае операцию, даже если это операция сложения. Я же в своем коде считал, что операция сложения при использовании accumulate должна применяться для всех его аргументов по умолчанию. Но таким образом accumulate ведет себя лишь в базовом случае, когда используются только 3 аргумента. Поэтому, в своем коде я использовал операцию сложения лишь для прибавления символа "-" к стоп-словам.