Как перебрать слова из строки (разделены пробелами) и занести в вектор (без цикла 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"