Как выполнить объединение строк с помощью вектора?

Нужно выполнить объединение строк текста в одну с заданным разделителем, заранее зарезервировав необходимое хранилище. Разделитель передаётся отдельным параметром и помещается между строками. Вместо массива использовать вектор.

Попытка воплотить это:

#include <iostream>  
#include <vector>
#include <iterator>
#include <string>

using namespace std;

 


template<typename T>
string Konk(const &T a)
{
  
    string str = "--";
  string konk = accumulate(next(begin(a)), end(a), to_string(a[0]), [](string a, string b))
  {
    return a + str + b;
  }
}

int testChangeStr()
{
    vector<string> subStr =
    {
    "tank",
    "B",
    "250",
    "litres",
    "1.5",
    "water"
    };
    return 0;
}
 
 
 
int main()
{
 
    cout << "test konk: ";
 
    cout << Konk(subStr);
 
    return 0;
 
}

Этот ужас стыдно показывать


Ответы (1 шт):

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

Немного исправил Ваш вариант:

  1. Если в качестве начального значения (параметр init в std::accumulate) используете элемент контейнера - проверьте, не пуст ли он. Иначе все закончится ошибкой сегментации.
  2. Нет необходимости использовать std::to_string - исходный вектор и так содержит объекты типа std::string.
  3. Возможно, в данном случае это и не так важно, но все же упомяну - accumulation value можно передать в функцию по значению, а затем сделать std::move для избежания лишних операций копирования.

P.S. А что у Вас делает функция testChangeStr? :)


#include <iostream>
#include <vector>
#include <string>
#include <numeric>

#define NON_EMPTY_LIST 1

auto concat(const std::string& sep, const std::vector<std::string>& strs) -> std::string
{
    if (strs.empty())
    {
        return {};
    }

    return std::accumulate(std::next(strs.cbegin()), strs.cend(), *strs.cbegin(),
        [&sep](std::string c, const std::string& s)
            { return std::move(c) + sep + s; });
}

auto concat_test()
{
    static const std::vector<std::string> strs =
        {
#if NON_EMPTY_LIST
            "hello",
            "world",
            "!"
#endif
        };

    std::cout << concat("_", strs) << std::endl;
}

auto main() -> int
{
    concat_test();
    return 0;
}

Wandbox Live Example

→ Ссылка