Questo è il motivo di progettazione standard per l'intera libreria: contenitori separati dagli algoritmi.
Se lo facevi a modo tuo, dovresti implementare ogni funzione X per ogni contenitore Y, portandoti a implementazioni M * N se disponi di funzioni M e N contenitori.
Utilizzando gli iteratori e gli algoritmi di elaborazione funzionano su iteratori anziché su contenitori, è necessario implementare solo algoritmi M più interfacce iteratore.
Questa separazione significa anche che hai infinitamente più ampio campo di applicazione: gli algoritmi non possono semplicemente essere utilizzati per ogni contenitore libreria, ma per qualsiasi contenitore, presente o futuro, che qualcuno decide di scrivere e attrezzare con iteratori . Il riutilizzo finito e infinito è un argomento abbastanza forte! E chiamare gli algoritmi attraverso l'interfaccia generica e gratuita non aggiunge alcun costo.
fonte
2011-09-03 11:33:46
perché si richiederlo? le funzioni membro servono solo allo scopo se l'implementazione può essere resa più efficiente (set :: find è più efficiente di std :: find() su un set).Oh, e se vuoi evitare onnipresente '.begin()', en '.end()' chiama, usa [Boost Range Algorithms] (http://www.boost.org/doc/libs/1_47_0/libs/ gamma/doc/html/gamma/riferimento/algoritmi/introduction.html). Zucchero sintattico dolce – sehe
@sehe: o * less * efficient, come 'std :: list :: sort()' :-) –
@Kerrek: 'std :: list :: sort' è speciale,' std :: sort' richiede 'RandomAccessIterator', quindi non potrebbe funzionare per gli elenchi. –