C++: Elegantný výpis iterovateľného

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&lt;int&gt; b(a, a+5);<br />
copy(b.begin(), b.end(), ostream_iterator&lt;int&gt;(cout, &quot;,&quot;));<br />
cout &lt;&lt; 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&lt;class T&gt;<br />
void print_range(T begin, T end, string delimiter = &quot;,&quot;, ostream&amp; os = cout)<br />
{<br />
T it = begin;<br />
while(it != end)<br />
{<br />
cout &lt;&lt; *it;<br />
if(++it != end)<br />
os &lt;&lt; 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&lt;int&gt; b(a, a+5);<br />
print_range(b.begin(), b.end());<br />
cout &lt;&lt; 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č :) .

Comments

Leave a Reply

Your email address will not be published. Please enter your name, email and a comment.

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>