Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Эффективное использование STL. Библиотека программиста - Мейерс С.

Мейерс С. Эффективное использование STL. Библиотека программиста — Спб.: Питер , 2002. — 224 c.
ISBN 5-94723-382-7
Скачать (прямая ссылка): effektivnoeispolzovaniestlbibliote2002.djvu
Предыдущая << 1 .. 36 37 38 39 40 41 < 42 > 43 44 45 46 47 48 .. 114 >> Следующая

существовало бы, но вследствие особенностей внутреннего представления
функция vector<T>: :operator[] должна вернуть несуществующую ссылку на
отдельный бит.
Чтобы справиться с этим затруднением, функция vector<T>: :operator[]
возвращает объект, который имитирует ссылку на отдельный бит - так
называемый промежуточный объект. Для использования STL не обязательно
понимать, как работают промежуточные объекты, но вообще это весьма
полезная идиома C++. Дополнительная информация о промежуточных объектах
приведена в совете 30 "More Effective C++", а также в разделе "Паттерн
Proxy" книги "Приемы объектно-ориентированного проектирования" [6]. На
простейшем уровне vector<bool> выглядит примерно так:
template <typename Allocator"
vector<bool.Allocator" {
public:
class reference {...}: // Класс, генерирующий проме)куточные
// объекты для ссылок на отдельные биты
reference operator[](size_type n); 11 operator[] возвращает
// промежуточный объект
}:
Теперь понятно, почему следующий фрагмент не компилируется:
vector<bool> v;
bool *pb=&v[0]: // Ошибка! Выражение в правой части относится к типу
// vector<bool>: reference*, а не bool*
А раз фрагмент не компилируется, vector<bool> не удовлетворяет
требованиям к контейнерам STL. Да, специфика vector<bool> особо оговорена
в Стандарте; да, этот контейнер почти удовлетворяет требованиям к
контейнерам STL, но "почти" не считается. Чем больше вы напишете
шаблонов, предназначенных для работы с STL, тем глубже вы осознаете эту
истину. Уверяю вас, наступит день, когда написанный вами шаблон будет
работать лишь в том случае, если получение адреса элемента контейнера
дает указатель на тип элемента; и когда этот день придет, вы наглядно
ощутите разницу между контейнером и почти контейнером.
Спрашивается, почему же vector<bool> присутствует в Стандарте, если это
не контейнер? Отчасти это связано с одним благородным, но неудачным
экспериментом, но позвольте мне ненадолго отложить эту тему и заняться
более насущным вопросом. Итак, от vector<bool> следует держаться
подальше, потому что это не контейнер - но что же делать, когда вам
действительно понадобится вектор логических величин?
В стандартную библиотеку входят два альтернативных решения, которые
подходят практически для любых ситуаций. Первое решение - deque<bool>.
Контейнер deque обладает практически всеми возможностями vector (за
исключением разве
82 Глава 2 • Контейнеры vector и string
что reserve и capacity), но при этом deque<bool> является полноценным
контейнером STL, содержащим настоящие значения bool. Конечно, внутренняя
память deque не образует непрерывный блок, поэтому данные deque<bool> не
удастся передать функции С, получающей массив bool (см. совет 16), но это
не удалось бы сделать и с vector<bool> из-за отсутствия переносимого
способа получения данных vector<bool>. (Прием, продемонстрированный для
vector в совете 16, не компилируется для vector<bool>, поскольку он
зависит от возможности получения на тип элемента, хранящегося в векторе,
- как упоминалось выше, vector<bool> не содержит bool.)
Второй альтернативой для vector<bool > является bitset. Вообще говоря,
bitset не является стандартным контейнером STL, но входит в стандартную
библиотеку C++. В отличие от контейнеров STL, размер bitset (количество
элементов) фиксируется на стадии компиляции, поэтому операции вставки-
удаления элементов не поддерживаются. Более того, поскольку bitset не
является контейнером STL, в нем отсутствует поддержка итераторов. Тем не
менее bitset, как и vector<bool>, использует компактное представление
каждого элемента одним битом, поддерживает функцию flip контейнера
vector<bool> и ряд других специальных функций, имеющих смысл в контексте
битовых множеств. Если вы переживете без итераторов и динамического
изменения размеров, вероятно, bitset хорошо подойдет для ваших целей.
А теперь вернемся к благородному, но неудачному эксперименту, из-за
которого появился "псевдоконтейнер" vector<bool> Я уже упоминал о том,
что промежуточные объекты часто используются при программировании на C++.
Члены Комитета по стандартизации C++ знали об этом, поэтому они решили
создать vector<bool> как наглядный пример контейнера, доступ к элементам
которого производится через промежуточные объекты. Предполагалось, что
при наличии такого примера в Стандарте у программистов появится готовый
образец для построения собственных аналогов.
В итоге выяснилось, что создать контейнер с промежуточными объектами,
удовлетворяющий всем требованиям к контейнеру STL, невозможно. Так или
иначе, следы этой неудачной попытки сохранились в Стандарте. Можно долго
гадать, почему vector<bool > был сохранен, но с практической точки зрения
это несущественно. Главное - помните, что vector<bool> не удовлетворяет
требованиям к контейнерам STL, что им лучше не пользоваться и что
существуют альтернативные структуры данных deque<bool> и bitset, почти
всегда способные заменить vector<bool>.
Предыдущая << 1 .. 36 37 38 39 40 41 < 42 > 43 44 45 46 47 48 .. 114 >> Следующая