Non hai capito. L'algoritmo non è membro di una classe iterator, l'algoritmo è una funzione a sé stante che si può usare passandole qualunque tipo di iteratore.Originariamente inviato da lio.b
Ok... ma ho ancora dei dubbi. Nel momento in cui ho un iteraotre come dici te posso semplicemente implementare quel metodo (che hai postato) in una classe iterator e dopodichè usarlo nelle classe derivate col polimorfismo. Questo è il tipico uso di linguaggi come java e non vedo cosa possa darmi in più l'uso dei template.
Ma a livello di performance sono uguali?
Il punto è che un modello classico OOP presupporrebbe che tutti gli iteratori ereditassero da una classe base comune, e tutti gli algoritmi andrebbero implementati o a livello di container, o a livello di un tipo particolare di iteratore. Probabilmente sarebbe necessario ricorrere a casini strani di ereditarietà multipla, la questione sarebbe molto scomoda da gestire, sarebbe necessario usare sempre chiamate virtuali, che hanno un certo overhead e non si possono espandere inline.
Al contrario, in questa maniera il design è molto più pulito: l'algoritmo è una funzione a sé stante che suppone di avere iteratori (che possono essere di qualunque tipo, non è necessario che ereditino da una superclasse comune) che dispongono di determinati operatori, ciascun container fornisce i suoi iteratori, che possono essere implementati in qualunque maniera purché forniscano gli operatori che servono ai vari algoritmi. Si ottiene così il massimo della flessibilità, senza contare che si possono evitare le chiamate virtuali ed espandere in linea i vari operatori, la qual cosa porta a vantaggi prestazionali notevoli, dato che gli iteratori di rado contengono procedure più lunghe di poche linee di codice.