присоединиться с помощью функции шаблона
Я использовал a template
function
для соединения vector
элементов и удалил ненужный if
оператор, перебирая только от первого до предпоследнего элементов в vector
, а затем присоединяясь к последнему элементу послеfor
цикла. Это также устраняет необходимость в дополнительном коде для удаления лишнего разделителя в конце объединенной строки. Итак, никаких if
инструкций, замедляющих итерацию, и никакого лишнего разделителя, который нужно убирать.
Это производит вызов функции элегантного , чтобы присоединиться к vector
о string
,integer
илиdouble
и т.д.
Я написал две версии: одна возвращает строку; другой записывает прямо в поток.
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
template<typename T>
string join(const vector<T>& v, const string& sep)
{
ostringstream oss;
const auto LAST = v.end() - 1;
for (typename vector<T>::const_iterator p = v.begin(); p != LAST; ++p)
{
oss << *p << sep;
}
oss << *LAST;
return oss.str();
}
template<typename T>
void join(const vector<T>& v, const string& sep, ostream& os)
{
const auto LAST = v.end() - 1;
for (typename vector<T>::const_iterator p = v.begin(); p != LAST; ++p)
{
os << *p << sep;
}
os << *LAST;
}
int main()
{
vector<string> strings
{
"Joined",
"from",
"beginning",
"to",
"end"
};
vector<int> integers{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<double> doubles{ 1.2, 3.4, 5.6, 7.8, 9.0 };
cout << join(strings, "... ") << endl << endl;
cout << join(integers, ", ") << endl << endl;
cout << join(doubles, "; ") << endl << endl;
join(strings, "... ", cout);
cout << endl << endl;
join(integers, ", ", cout);
cout << endl << endl;
join(doubles, "; ", cout);
cout << endl << endl;
return 0;
}
Выход
Joined... from... beginning... to... end
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
1.2; 3.4; 5.6; 7.8; 9
Joined... from... beginning... to... end
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
1.2; 3.4; 5.6; 7.8; 9