Во-первых, здесь необходим потоковый класс ostringstream
, чтобы многократно выполнять конкатенацию и избавлять от основной проблемы чрезмерного выделения памяти.
Код:
string join(const vector<string>& vec, const char* delim)
{
ostringstream oss;
if(!string_vector.empty()) {
copy(string_vector.begin(),string_vector.end() - 1, ostream_iterator<string>(oss, delim.c_str()));
}
return oss.str();
}
vector<string> string_vector {"1", "2"};
string delim("->");
string joined_string = join(); // get "1->2"
Пояснение:
, думая, трактуйте oss
здесь как std::cout
когда мы хотим написать:
std::cout << string_vector[0] << "->" << string_vector[1] << "->"
,
мы можем использовать следующие классы STL в качестве справки:
ostream_iterator
возвращает упакованный поток вывода с разделителями, автоматически добавляемыми при каждом использовании <<
.
например,
ostream my_cout = ostream_iterator<string>(std::cout, "->")
обертывания std:cout
как my_cout
так каждый раз, когда вы my_cout << "string_vector[0]"
,
это значит std::cout << "string_vector[0]" << "->"
Что касается
copy(vector.begin(), vector.end(), std::out);
это значит
std::cout << vector[0] << vector[1] (...) << vector[end]