С Ускоренный C ++ (книга), я нашел этот код, идентичный программе, но обработанный в самой программе другой, и смутил меня в некоторой части.
Приведенный ниже код, ну, очевидно, он будет выводить каждое слово одно за другим (по циклам) на основе пользовательского ввода после того, как пользователь включил конец файла, а затем завершит программу.
int main()
{
string s;
while (cin >> s)
cout << s << endl;
return 0;
}
В отличие от приведенного выше кода, это слово будет хранить каждое слово в vector
, затем использовать индексы i
и j
для обнаружения непробельного символа, и настоящий вопрос в том, что я не понимаю, как это происходит с вектором.
Что такое пробел в vector
? Элемент?
Сначала я думал, что программа будет проходить через каждый символ , потому что я думал, что пробел - это символ (для которого предназначена функциональность i
и j
), затем , книга пришла и сказала, что она проходит через каждое слово , я не знаю, как проверить это сам, как я вижу, как внутренний процесс в самом компиляторе ..
vector<string> split(const string& s)
{
vector<string> ret;
typedef string::size_type string_size;
string_size i = 0;
// invariant: we have processed characters [original value of i, i)
while (i != s.size())
{
// ignore leading blanks
// invariant: characters in range [original i, current i) are all spaces
while (i != s.size() && isspace(s[i]))
++i;
// find end of next word
string_size j = i;
// invariant: none of the characters in range [original j, current j)is a space
while (j != s.size() && !isspace(s[j]))
j++;
// if we found some nonwhitespace characters
if (i != j) {
// copy from s starting at i and taking j - i chars
ret.push_back(s.substr(i, j - i));
i = j;
}
}
return ret;
}
int main() {
string s;
// read and split each line of input
while (getline(cin, s)) {
vector<string> v = split(s);
// write each word in v
for (vector<string>::size_type i = 0; i != v.size(); ++i)
cout << v[i] << endl;
}
return 0;
}