¿Cómo escribir una función que tome un iterador o una colección de forma genérica?

He sido programador de Java casi exclusivamente durante los últimos 8 años, y recientemente he estado jugando con C ++ nuevamente. Este es un problema al que me he enfrentado con respecto a los iteradores en C ++ STL y Java.

En Java, puede escribir un método que tome un iterador como este:

void someMethod(Iterator<String> data) {
    // ...
}

Pasas en unIterator y el método no necesita saber cuál es la colección subyacente de ese iterador, lo que es bueno.

En C ++, no hay una clase base común para los iteradores (que yo sepa). Tendría que escribir una función como esta:

void some_function(std::vector<std::string>::const_iterator data) {
    // ...
}

En otras palabras,some_function sabe que el iterador es un iterador sobre unvector. Eso no es bueno, porque quiero que la función funcione independientemente de cuál sea la colección subyacente del iterador.

¿Cómo puedo hacer esto en C ++? Si realmente no es posible, ¿cuál es la mejor manera de crear una función en C ++ que tome una colección como parámetro, pero que no necesite saber cuál es el tipo exacto de colección?

Apéndice

Gracias por las respuestas. Además de las respuestas, encontré buena información sobre esto en el párrafo 7.5 (Características del iterador) del libro.La biblioteca estándar de C ++: un tutorial y referencia (por Nicolai M. Josuttis). El párrafo 7.5.1 explica cómo escribir versiones especializadas de funciones para diferentes categorías de iteradores.

Respuestas a la pregunta(4)

Su respuesta a la pregunta