Программирование. Принципы и практика использования C++ Исправленное издание, стр. 164
Как всегда, оператор
>>*thisПроверка разделителей проста; мы сравниваем символ с каждым символом из строки, в которой записаны разделители.
bool Punct_stream::is_whitespace(char c){ for (int i = 0; i<white.size(); ++i) if (c==white[i]) return true; return false;}Напомним, что поток
istringstreamОсталась одна загадочная функция.
Punct_stream::operator bool(){ return !(source.fail() || source.bad()) && source.good();}Обычное использование потока
istream>>while (ps>>s) { /* ... */ }Это значит, что нам нужен способ для проверки результата выполнения инструкции
ps>>sps>>sPunct_streamPunct_streamboolbool()Punct_streamФункция-член operator
bool()Punct_streambooltruePunct_streamТеперь можем написать программу.
int main() // вводит текст и создает упорядоченный список всех слов // из заданного текста, игнорируя знаки пунктуации и регистры, // а также удаляя дубликаты из полученного результата{ Punct_stream ps(cin); ps.whitespace(";:,.?!()\"{}<>/&$@#%^*|~"); // \" в строке // означает " ps.case_sensitive(false); cout << "Пожалуйста, введите слова \n"; vector<string> vs; string word; while (ps>>word) vs.push_back(word); // ввод слов sort(vs.begin(),vs.end()); // сортировка в лексикографическом // порядке for (int i=0; i<vs.size(); ++i) // запись в словарь if (i==0 || vs[i]!=vs[i–1]) cout << vs[i] << endl;}Этот код создает упорядоченный список введенных слов. Инструкция
if (i==0 || vs[i]!=vs[i–1])удаляет дубликаты. Если в программу ввести слова
There are only two kinds of languages: languages that people complain
about, and languages that people don’t use.
то результат ее работы будет выглядеть следующим образом:
aboutandarecomplaindon’tkindlanguagesofonlypeoplethattheretwouseПочему мы получили на выходе
don’tdontwhitespace()
Punct_streamistreamrdstate()eof()>>Punct_streamistreamPunct_istreamistream
Punct_stream• показать реальную задачу и способ ее решения;