bergabunglah menggunakan fungsi template
Saya menggunakan a template
function
untuk menggabungkan vector
item, dan menghapus if
pernyataan yang tidak perlu dengan mengulang hanya item pertama ke item kedua dari belakang di vector
, lalu bergabung dengan item terakhir setelah for
loop. Ini juga meniadakan kebutuhan kode tambahan untuk menghapus pemisah ekstra di akhir string yang digabungkan. Jadi, tidak ada if
pernyataan yang memperlambat iterasi dan tidak ada pemisah berlebihan yang perlu dirapikan.
Ini menghasilkan panggilan fungsi elegan untuk bergabung dengan vector
dari string
, integer
atau 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