palabras Suponiendo son espacios en blanco separado:
unsigned int countWordsInString(std::string const& str)
{
std::stringstream stream(str);
return std::distance(std::istream_iterator<std::string>(stream), std::istream_iterator<std::string>());
}
Nota: Puede haber más de un espacio entre las palabras. Además, esto no capta otros caracteres de espacio en blanco, como tabulación nueva línea o retorno de carro. Entonces contar espacios no es suficiente.
El operador de entrada de secuencia >> cuando se utiliza para leer una cadena de una secuencia. Lee una palabra separada en blanco. Probablemente buscaban que lo usara para identificar palabras.
std::stringstream stream(str);
std::string oneWord;
stream >> oneWord; // Reads one space separated word.
Cuando puede usar esto para contar palabras en una cadena.
std::stringstream stream(str);
std::string oneWord;
unsigned int count = 0;
while(stream >> oneWord) { ++count;}
// count now has the number of words in the string.
está complicando:
corrientes pueden ser tratados como cualquier otro recipiente y hay iteradores a bucle a través de ellos std :: istream_iterator. Cuando usas el operador ++ en un istream_iterator, solo lees el siguiente valor de la secuencia usando el operador >>. En este caso, estamos leyendo std :: string para que lea una palabra separada del espacio.
std::stringstream stream(str);
std::string oneWord;
unsigned int count = 0;
std::istream_iterator loop = std::istream_iterator<std::string>(stream);
std::istream_iterator end = std::istream_iterator<std::string>();
for(;loop != end; ++count, ++loop) { *loop; }
El uso de std :: distancia simplemente envuelve todo lo anterior en un paquete ordenado, ya que encontrar la distancia entre dos iteradores haciendo ++ en la primera hasta llegar a la segunda.
Para evitar copiar la cadena que puede ser astuto:
unsigned int countWordsInString(std::string const& str)
{
std::stringstream stream;
// sneaky way to use the string as the buffer to avoid copy.
stream.rdbuf()->pubsetbuf (str.c_str(), str.length());
return std::distance(std::istream_iterator<std::string>(stream), std::istream_iterator<std::string>());
}
Nota: todavía copiar cada palabra del original en un temporal. Pero el costo de eso es mínimo.
"hasta que toco un nulo" - ¿cómo son nulos especiales en una cadena en C++? – Cubbi
@Cubbi: Bien manchado. No me uní a los puntos allí. –
Por las respuestas dadas a continuación, parece que se requiere más contexto. Algunas industrias usan el C++ "moderno", descubriendo que el costo de usar STL y aumentar más que compensa las ganancias de productividad. Otras industrias prefieren usar una versión más similar a C de C++ para que haya una asignación más directa de las líneas de código a las instrucciones del procesador. Las respuestas futuras a las preguntas en este sentido servirían para determinar al menos la industria a la que el candidato está postulando. –