Рассмотрим более простую задачу: создадим список номеров вхождений слов в текст. Для этого вполне естественно записать список слов вместе с количеством их вхождений в текст.
Также возможно вы думаете, что такая тема как http://www.arenda-avtobusa.ru/bus/catalog.php?id=neoplan116 никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт arenda-avtobusa.ru
автобус неоплан там представлен в широком ассортименте. Там можно узнать много интересного про автобус неоплан, где найти автобус неоплан.
Что означает вообще автобус неоплан, где есть автобус неоплан - про это написано на сайте arenda-avtobusa.ru.
Это важная для многих тема - автобус неоплан Спасибо сайту arenda-avtobusa.ru за информацию про автобус неоплан
Считывая новое слово, мы проверяем, не появлялось ли оно ранее; если нет, вставляем его в список и связываем с ним число 1. Для этого можно было бы использовать объект типа list или vector, но тогда мы должны были бы искать каждое считанное слово. Такое решение было бы слишком медленным. Класс map хранит свои ключи так, чтобы их было легко увидеть, если они там есть. В этом случае поиск становится тривиальной задачей. int main()
{
map words; // хранит пары (слово, частота)
21.6. АССОЦИАТИВНЫЕ КОНТЕЙНЕРЫ
777
string s;
while (cin>>s) ++words[s]; // контейнер words индексируется
// строками
typedef map::const_iterator Iter; for (Iter p = words.begin(); p!=words.end(); ++p)
cout << p->first << ": 11 << p->second << '\n';
}
Самой интересной частью этой программы является выражение ++words[s]. Как видно уже в первой строке функции main(), переменная words — это объект класса map, состоящий из пар (string,int); т.е. контейнер words отображает строки string в целые числа int. Иначе говоря, имея объект класса string, контейнер words дает нам доступ к соответствующему числу типа int. Итак, когда мы индексируем контейнер words объектом класса string (содержащим слово, считанное из потока ввода), элемент words[s] является ссылкой на число типа int, соответствующее строке s. Рассмотрим конкретный пример.
words[Msultan"]
Г7Г Если строки "sultan" еще не было, то она вставляется в контейнер words “1 вместе со значением, заданным по умолчанию для типа int, т.е. 0. Теперь контейнер words содержит элемент ("sultan",0). Следовательно, если строка "sultan" ранее не вводилась, то выражение ++words["sultan"] свяжет со строкой "sultan" значение 1. Точнее говоря, объект класса map выяснит, что строки "sultan" в нем нет, вставит пару ("sultan",0), а затем оператор ++ увеличит это значение на единицу, в итоге оно станет равным 1.
Проанализируем программу еще раз: выражение ++words[s] получает слово из потока ввода и увеличивает его значение на единицу. При первом вводе каждое слово получает значение 1. Теперь смысл цикла становится понятен.
while (cin>>s) ++words[s];
Он считывает каждое слово (отделенное пробелом) из потока ввода и вычисляет количество его вхождений в контейнер. Теперь нам достаточно просто вывести результат. По контейнеру map можно перемещаться так же, как по любому другому контейнеру из библиотеки STL. Элементы контейнера map имеют тип pair. Первый член объекта класса pair называется first, второй — second. Цикл вывода выглядит следующим образом
Оператор typedef предназначен для обеспечения удобства работы и удобочитаемости программ. В качестве текста мы ввели в программу вступительный текст из первого издания книги The C++ Programming Language.
Опубликовал katy
April 23 2015 08:57:53 ·
0 Комментариев ·
3386 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.