2009-04-25 7 views
11

Ich bin ein Iterator übergeben und ich muss es an eine andere Funktion übergeben - aber gefiltert, so dass bestimmte Elemente übersprungen werden (es ist eine Reihe von Zeigern, und ich möchte die NULL-Zeiger ausfiltern).boost :: filter_iterator - wie würde ich das mit der STL machen?

Ich googeln für „stl Filter Iterator“, um zu sehen, wie dies zu tun, und boost::filter_iterator kam.

Das sieht gut aus und ich könnte es benutzen, aber könnte ich das auch mit der guten alten STL machen? Natürlich ohne die Elemente in einen neuen Container zu kopieren.

Ich denke, ich müsste eine andere Iterator-Klasse erstellen, die die notwendigen begin(), end() usw. Funktionen bereitstellt und filtert? Also müsste ich genau die boostiterator_filter ... re-implementieren?

Antwort

8

Sie haben Recht; Sie würden den Filter-Iterator im Wesentlichen selbst erstellen. Mein Rat wäre, Boost filter_iterator zu verwenden. Boost hat einen besonderen Status als die meistgenutzte externe Bibliothek von C++; Viele C++ Committee-Mitglieder haben geholfen, Bibliotheken für Boost zu schreiben. Seine Allgegenwart macht es im Wesentlichen fast so wie es ist; Es gibt wirklich keinen Grund, das Rad hier neu zu erfinden.

+3

Ich stimme etwas nicht zu: Boost kann mühsam installiert werden, und manchmal wollen Sie nicht, dass zusätzliche Abhängigkeit. Ich denke der * wirkliche * Grund, dass man 'filter_iterator' nicht umschreiben würde, ist, dass es in der Tat ziemlich schwierig (und sehr mühsam) ist, richtig zu schreiben. –

4

Ich stimme rlbond zu. Erfinden Sie das Rad nicht neu und verwenden Sie Boost :: filter_iterator. Wenn Sie nicht möchten, dass alle Boost-Bibliotheken in Ihrem Projekt vorhanden sind, sollten Sie in Betracht ziehen, boost.bcp zu verwenden, um genau diejenigen zu extrahieren, die Sie benötigen.