Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
8. Как установить итератор на следующий элемент?
9. Как установить итератор на предыдущий элемент?
10. Что произойдет, если вы попытаетесь установить итератор на ячейку, следующую за концом последовательности?
11. Какие виды итераторов могут перемещаться на предыдущий элемент?
12. Почему полезно отделять данные от алгоритмов?
13. Что такое STL?
14. Что такое связанный список? Чем он в принципе отличается от вектора?
15. Что такое узел (в связанном списке)?
16. Что делает функция
17. Как определить, что последовательность пуста?
18. Какие операции предусмотрены в итераторе для класса
19. Как обеспечить перемещение по контейнеру, используя библиотеку STL?
20. В каких
21. В каких ситуациях лучше использовать класс
22. Что такое контейнер?
23. Что должны делать функции
24. Какие контейнеры предусмотрены в библиотеке STL?
25. Перечислите категории итераторов? Какие виды итераторов реализованы в библиотеке STL?
26. Какие операции предусмотрены в итераторе с произвольным доступом, но неподдерживаются двунаправленным итератором?
Термины
Упражнения
1. Если вы еще не выполнили задания из врезок ПОПРОБУЙТЕ, то сделайте это сейчас.
2. Попробуйте запрограммировать пример с Джеком и Джилл из раздела 20.1.2. Для тестирования используйте несколько небольших файлов.
3. Проанализируйте пример с палиндромом (см. раздел 20.6); еще раз выполните задание из п. 2, используя разные приемы.
4. Найдите и исправьте ошибки, сделанные в примере с Джеком и Джилл в разделе 20.3.1, используя приемы работы с библиотекой STL.
5. Определите операторы ввода и вывода (
6. Напишите операцию “найти и заменить” для класса
7. Определите лексикографически последнюю строку в неупорядоченном классе
8. Напишите функцию, подсчитывающую количество символов в объекте класса
9. Напишите программу, подсчитывающую количество слов в объекте класса
10. Напишите программу, подсчитывающую слова, в которой пользователь мог бы сам задавать набор символов-разделителей.
11. Создайте объект класса
12. Завершите определение класса
13. На самом деле в классе
14. Определите односвязный список
15. Определите класс
16. Определите класс
17. Определите класс
18. Определите итератор с проверкой выхода за пределы допустимого диапазона для класса
19. Определите итератор с проверкой выхода за пределы допустимого диапазона для класса
20. Выполните эксперимент, посвященный сравнению временных затрат при работе с классами
Послесловие
Если бы у нас было N видов контейнеров, содержащих данные, и M операций, которые мы хотели бы над ними выполнить, то мы могли бы легко написать N*M фрагментов кода. Если бы данные имели K разных типов, то нам пришлось бы написать N*M*K фрагментов кода. Библиотека STL решает эту проблему, разрешая задавать тип элемента в виде параметра (устраняя множитель K) и отделяя доступ к данным от алгоритмов. Используя итераторы для доступа к данным в любом контейнере и в любом алгоритме, мы можем ограничиться N+M алгоритмами. Это огромное облегчение. Например, если бы у нас было 12 контейнеров и 60 алгоритмов, то прямолинейный подход потребовал бы создания 720 функций, в то время как стратегия, принятая в библиотеке STL, требует только 60 функций и 12 определений итераторов: тем самым мы экономим 90% работы. Кроме того, в библиотеке STL приняты соглашения, касающиеся определения алгоритмов, упрощающие создание корректного кода и облегчающие его композицию с другими кодами, что также экономит много времени.
Глава 21
Алгоритмы и ассоциативные массивы
“Теоретически практика проста”.
Тригве Рийнскауг (Trygve Reenskaug)
В этой главе мы завершаем описание идей, лежащих в основе библиотеки STL, и наш обзор ее возможностей. Здесь мы сосредоточим свое внимание на алгоритмах. Наша главная цель — ознакомить читателей с десятками весьма полезных алгоритмов, которые сэкономят им дни, если не месяцы, работы. Описание каждого алгоритма сопровождается примерами его использования и указанием технологий программирования, которые обеспечивают его работу. Вторая цель, которую мы преследуем, — научить читателей писать свои собственные элегантные и эффективные алгоритмы в тех случаях, когда ни стандартная, ни другие доступные библиотеки не могут удовлетворить их потребности. Кроме того, мы рассмотрим еще три контейнера: