El reemplazar el punto por el espacio en blanco me parece lo mas sencillo, es fácil de realizar y de comprender, en mi opinión.
El usar find() para encontrar "." y hacer reparaciones en ese caso recorre el string también (en la implementacion interna), de modo que hacerlo al inicio explícitamente para reemplazar no tiene un costo superior. Lo malo, en mi opinion, que tiene usar find() e índices es que esa solucion al usarlos puede tener errores o condiciones de bordes que considerar. Me parece mejor, en este caso, usar la funcionalidad ya implementada por el tokenizador.
El nuevo código de cuenta() que reemplaza el punto por espacio en blanco y luego usa el comportamiento normal de tokenizacion del istringstream podria entonces ser escrito asi:
Código C++:
Ver originalint cuenta( string s ) {
std::replace( s.begin(), s.end(), '.', ' ' ); // <-- reemplazo aqui
istringstream is(s);
string token;
int cuenta = 0;
while( is >> token ) { ++cuenta; }
return cuenta;
}
Básicamente similar al anterior, pero considera los problemas relacionados con el punto en medio o al final que se ha identificado.
std::replace() está en algorithm, hay que #incluir <algorithm> para usarlo.