Po dlhšom čase opäť prichádzam s malým, ale užitočným kusom kódu, tentokrát v C++.
Tí, čo programujú v C++ iste už použili dvojicu copy a ostream_iterator z STL, kombináciou ktorých jednoducho dokážeme vypísať všetko, čo sa dá prejsť iterátorom.
Tento spôsob ale prináša jednu nevýhodu – oddeľovač sa vypíše aj po poslednom prvku, čo je estetická chyba, ktorá nám môže vadiť. Čítajte ďalej.
Napríklad:
<br />
int a[] = {1,2,3,4,5};<br />
vector<int> b(a, a+5);<br />
copy(b.begin(), b.end(), ostream_iterator<int>(cout, ","));<br />
cout << endl;<br />
Vypíše:
1,2,3,4,5,
Riešenie
Pre tých, ktorým formát výstupu nie je ľahostajný, som pripravil jednoduchú funkciu.
<br />
template<class T><br />
void print_range(T begin, T end, string delimiter = ",", ostream& os = cout)<br />
{<br />
T it = begin;<br />
while(it != end)<br />
{<br />
cout << *it;<br />
if(++it != end)<br />
os << delimiter;<br />
}<br />
}<br />
Funkcia nám jednoducho prejde iterátorom (parameter šablóny T) po nejakých dátach, vypíše ich a okrem posledného prvku za každým dá oddeľovač.
Príklad použitia:
<br />
int a[] = {1,2,3,4,5};<br />
vector<int> b(a, a+5);<br />
print_range(b.begin(), b.end());<br />
cout << endl;<br />
Vypíše:
1,2,3,4,5
Všimnime si, že kompilátor nám implicitne doplní parameter šablóny, a týmpádom sa nemusíme starať v podstate o nič
.
