Как перебрать слова из строки (разделены пробелами) и занести в вектор (без цикла do-while) С++?

Пытаюсь выполнить задание в Яндекс. Практикуме по С++. Надо перебрать слова из сроки ввода (getline). И тут у меня ступор. С помощью do-while я сделал, но техподдержка настаивает на альтернативном решении.

Натолкните на мысль, пожалуйста.

Думал, перебрать посимвольно через char for-циклом, но не могу сообразить, как отследить начало и конец слов.


Ответы (2 шт):

Автор решения: Михаил Чернышов

В общем, решение следующее:

#include <iostream>
#include <string>
#include <vector>


using namespace std;


int main() {
    /* FOR SUPPORT: объявляем переменную для хранения строки вводимой пользователем */
    string query;
    /* FOR SUPPORT: считываем строку целиком */
    getline(cin, query);


    /* FOR SUPPORT: объявляем вектор строк для хранения слов */
    vector<string> words;
    /* FOR SUPPORT: объявляем строку для хранения слова */
    string word;
    /* FOR SUPPORT: начинаем цикл от 0 до размера строки (проходим посимвольно по всей строке) */
    for (int i = 0; i < query.size(); ++i) {
        /* FOR SUPPORT: условие на выполнение блока:
         * символ это пробел */
        if (query[i] == ' ') {
            /* FOR SUPPORT: добавляем слово в конец вектора слов */
            words.push_back(word);
            /* FOR SUPPORT: присваиваем переменной пустую строку, т.е. начинаем новое слово */
            word = ""s;
        /* FOR SUPPORT: условие на выполнение блока (когда все условия выше - не верны):
         * символ это не пробел (обратное условие) */
        } else {
            /* FOR SUPPORT: добавляем символ к строке.
             * Этим блоком мы собираем слово в переменной word */
            word += query[i];
        }
    }
    /* FOR SUPPORT: добавляем последнее слово word в конец вектора words */
    words.push_back(word);


    /* FOR SUPPORT: проходим по всем словам из вектора слов */
    for (string word : words) {
        /* FOR SUPPORT: выводим слово между [ и ] */
        cout << '[' << word << ']' << endl;
    }
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Если нужно обрабатывать входной поток по словам, то for_each нужно применить к istream_iterator:

// g++ -std=c++11 -pedantic -Wall -Wextra -Werror read-words-1.cpp

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>

void print(const std::string &s) {
    std::cout << '\"' << s << "\"\n";
}

int main() {
    std::for_each(
        std::istream_iterator<std::string>(std::cin),
        std::istream_iterator<std::string>(),
        print
    );
}
$ g++ -std=c++11 -pedantic -Wall -Wextra -Werror read-words-1.cpp 
$ echo -e "aa bb cc\ndd ee ff" | ./a.out 
"aa"
"bb"
"cc"
"dd"
"ee"
"ff"

Если вы собираетесь разбирать строку на слова, то istream_iterator надевает на строку поток чтения:

// g++ -std=c++11 -pedantic -Wall -Wextra -Werror read-words-2.cpp

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

void print(const std::string &s) {
    std::cout << '\"' << s << "\"\n";
}

int main() {
    const std::string s = "aa bb cc";
    std::istringstream iss(s);
    std::for_each(
        std::istream_iterator<std::string>(iss),
        std::istream_iterator<std::string>(),
        print
    );
}
$ g++ -std=c++11 -pedantic -Wall -Wextra -Werror read-words-2.cpp 
$ ./a.out 
"aa"
"bb"
"cc"
→ Ссылка