Алгоритм 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 шт):

Автор решения: DmitryK

Ну просто вы немного неправильно написали. Вам нужно чтобы к значению 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;
}
→ Ссылка
Автор решения: junker

Благодаря помощи @DmitryK удалось понять, что моя ошибка в коде заключалась в неправильном понимании работы алгоритма accumulate в общем случае, когда используется 4 аргумента, причем в качестве 4-го аргумента задействуется функция, которая должна указывать на используемую в данном случае операцию, даже если это операция сложения. Я же в своем коде считал, что операция сложения при использовании accumulate должна применяться для всех его аргументов по умолчанию. Но таким образом accumulate ведет себя лишь в базовом случае, когда используются только 3 аргумента. Поэтому, в своем коде я использовал операцию сложения лишь для прибавления символа "-" к стоп-словам.

→ Ссылка