dołącz za pomocą funkcji szablonu
Użyłem a, template
function
aby połączyć vector
elementy i usunąłem niepotrzebne if
stwierdzenie, przechodząc przez iterację tylko od pierwszego do przedostatniego elementu w vector
, a następnie dołączając do ostatniego elementu po for
pętli. Eliminuje to również potrzebę stosowania dodatkowego kodu w celu usunięcia dodatkowego separatora na końcu połączonego ciągu. Nie ma więc if
instrukcji spowalniających iterację i zbędnego separatora, który wymaga uporządkowania.
To daje elegancki wywołanie funkcji przyłączyć się vector
SIĘ GO string
, integer
lubdouble
itp
Napisałem dwie wersje: jedna zwraca ciąg; druga pisze bezpośrednio do strumienia.
#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;
}
Wynik
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