invalid_argument (см. раздел 5.6). Если преобразование создает значение, которое не может быть представлено заданным типом, они передают исключение out_of_range.
Упражнение 9.50. Напишите программу обработки вектора vector, элементы которого представляют целочисленные значения. Вычислите сумму всех элементов вектора. Измените программу так, чтобы она суммировала строки, которые представляют значения с плавающей точкой.
Упражнение 9.51. Напишите класс, у которого есть три беззнаковых члена, представляющих год, месяц и день. Напишите конструктор, получающий строку, представляющую дату. Конструктор должен понимать множество форматов даты, такие как January 1,1900, 1/1/1900, Jan 1,1900 и т.д.
Кроме последовательных контейнеров, библиотека предоставляет три адаптера последовательного контейнера: stack (стек), queue (очередь) и priority_queue (приоритетная очередь). stack получает любой из последовательных контейнеров (array и forward_list) и заставляет его работать подобно стеку. Функции и типы данных, общие для всех адаптеров контейнеров, перечислены в табл. 9.17.
Таблица 9.17. Функции и типы, общие для всех адаптеров
size_type | Тип данных, достаточно большой, чтобы содержать размер самого большого объекта этого типа |
value_type | Тип элемента |
container_type | Тип контейнера, на базе которого реализован адаптер |
A a; | Создает новый пустой адаптер по имени a |
A a(c); | Создает новый адаптер по имени а, содержащий копию контейнера с |
| Каждый адаптер поддерживает все операторы сравнения: ==, !=, <, <=, > и >=. Эти операторы возвращают результат сравнения внутренних контейнеров |
a.empty() | Возвращает значение true, если адаптер а пуст, и значение false в противном случае |
a.size() | Возвращает количество элементов в адаптере a |
swap(a, b) a.swap(b) | Меняет содержимое контейнеров а и b; у них должен быть одинаковый тип, включая тип контейнера, на основании которого они реализованы |
Каждый адаптер определяет два конструктора: стандартный конструктор, создающий пустой объект, и конструктор, получающий контейнер и инициализирующий адаптер, копируя полученный контейнер. Предположим, например, что deq — это двухсторонняя очередь deque. Ее можно использовать для инициализации нового стека следующим образом:
stack
По умолчанию оба адаптера, stack и queue, реализованы на основании контейнера deque, а адаптер priority_queue реализован на базе контейнера vector. Заданный по умолчанию тип контейнера можно переопределить, указав последовательный контейнер как второй аргумент при создании адаптера:
//
stack
//
svec stack