Zakładając słowa są białe znaki rozdzielone:
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>());
}
Uwaga: Może być więcej niż jedna przestrzeń między słowami. Nie powoduje to również przechwycenia innych znaków spacji, takich jak tabulacja nowej linii lub powrót karetki. Więc liczenie miejsc nie wystarczy.
Operator wprowadzania strumienia >> w przypadku użycia do odczytu łańcucha ze strumienia. Odczytuje jedno słowo oddzielone spacją. Tak więc prawdopodobnie szukali tego, aby użyć tego do identyfikacji słów.
std::stringstream stream(str);
std::string oneWord;
stream >> oneWord; // Reads one space separated word.
Kiedy można użyć tego do policzenia słów w ciągu znaków.
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.
Pierwsze skomplikowane:
Strumienie mogą być traktowane jak każdy inny pojemnik i są iteratory do pętli przez nich std :: istream_iterator. Kiedy używasz operatora ++ na istream_iterator, po prostu odczytaj następną wartość ze strumienia za pomocą operatora >>. W tym przypadku czytamy std :: string, aby odczytać słowo oddzielone spacją.
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; }
Używanie std :: odległość tylko zawija wszystko powyższe w pakiecie schludny jak to znaleźć odległość między dwoma iteratorów wykonująC++ na pierwszym dojeżdżamy do drugiego.
Aby uniknąć kopiowania ciąg możemy być podstępne:
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>());
}
Uwaga: wciąż skopiować każde słowo z oryginału na tymczasowy. Ale koszt tego jest minimalny.
"dopóki nie osiągnę wartości zerowej" - jak są nully specjalne w łańcuchu w C++? – Cubbi
@Cubbi: Dobrze zauważony. Nie dołączyłem do kropek tam. –
Zgodnie z poniższymi odpowiedziami wydaje się, że naprawdę potrzebny jest większy kontekst. Niektóre branże używają "nowoczesnego" C++, stwierdzając, że koszt używania STL i więcej niż rekompensuje wzrost wydajności. Inne gałęzie przemysłu wolą korzystać z bardziej podobnej do C wersji C++, więc istnieje bardziej bezpośrednie mapowanie linii kodu do instrukcji procesora. Przyszłe odpowiedzi na pytania z tego zakresu będą dobrze służyć określeniu przynajmniej branży, do której kandydat się domaga. –