bergabunglah menggunakan fungsi template
Saya menggunakan a template functionuntuk menggabungkan vectoritem, dan menghapus ifpernyataan yang tidak perlu dengan mengulang hanya item pertama ke item kedua dari belakang di vector, lalu bergabung dengan item terakhir setelah forloop. Ini juga meniadakan kebutuhan kode tambahan untuk menghapus pemisah ekstra di akhir string yang digabungkan. Jadi, tidak ada ifpernyataan yang memperlambat iterasi dan tidak ada pemisah berlebihan yang perlu dirapikan.
Ini menghasilkan panggilan fungsi elegan untuk bergabung dengan vectordari string, integeratau double, dll
Saya menulis dua versi: satu mengembalikan string; yang lainnya menulis langsung ke aliran.
#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;
}
Keluaran
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