Как выполнить объединение строк с помощью вектора?
Нужно выполнить объединение строк текста в одну с заданным разделителем, заранее зарезервировав необходимое хранилище. Разделитель передаётся отдельным параметром и помещается между строками. Вместо массива использовать вектор.
Попытка воплотить это:
#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
→ Ссылка
Немного исправил Ваш вариант:
- Если в качестве начального значения (параметр
initвstd::accumulate) используете элемент контейнера - проверьте, не пуст ли он. Иначе все закончится ошибкой сегментации. - Нет необходимости использовать
std::to_string- исходный вектор и так содержит объекты типаstd::string. - Возможно, в данном случае это и не так важно, но все же упомяну - 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;
}