#include
#include
using namespace std;
in t main ()
{
6:
|
vector vecBoolFlags (3); / /
|
создать экземпляр
|
|
/ /
|
для 3 логических флагов
|
vecBoolFlags [0] = true;
vecBoolFlags [1] = true;
9: vecBoolFlags [2] = fa lse ;
1 0 :
11: vecBoolFlags.push_back (true); / / вставить четвертый флаг в конец
1 2 :
13:
|
cout
|
«
|
"The contents
|
of
|
the vector
|
are: " « endl;
|
14:
|
for
|
(siz e _ t
|
nlndex =
|
0;
|
nlndex < vecBoolFlags. s iz e (); ++ nlndex)
|
15:
|
cout
|
«
|
vecBoolFlags
|
[nlndex] «
|
' ';
|
16:
|
|
|
|
|
|
|
|
cout « endl;
18:
|
vecBoolFlags. f l i p ();
|
19:
|
|
cout « "The contents of the vector are: " « endl;
21:
|
for (siz e _ t
|
nlndex = 0;
|
nlndex < vecBoolFlags. s iz e (); ++ nlndex)
|
22:
|
cout «
|
vecBoolFlags
|
[nlndex] « ' ';
|
23:
|
|
|
|
cout « endl;
return 0;
}
Результат
The contents of the vector are:
110 1
The contents of the vector are:
0010
Анализ
Здесь для обращ ения к логическим флагам в векторе используется оператор o p e ra to r!] (строки 7 -9), как и в обычном векторе. Функция f lip ( ) используется в
строке 18 для инверсии индивидуальных битовых флагов, по существу преобразовывая все 0 в 1, и наоборот. Обратите внимание на применение функции push_back () в строке 11. Хотя изначально вектор vecB oolFlags был создан для хранения трех флагов (строка 6),
строке 11 к нему удалось добавить еще один. Добавление большего количества флагов, чем было определено вначале, а также возможность выбрать их количество динамически уже после компиляции, отличает vector от класса s t d : :b its e t .
Резюме
На сегодняшнем занятии рассматривался весьма эффективный инструмент обработки битовых последовательностей и битовых флагов: класс s t d : : b i t s e t . Вы также узнали
классе v e c to r< b o o l> , который также позволяет хранить логические флаги, количество которых, однако, не обязательно знать на момент компиляции.
Вопросы и ответы
В ситуации, где применимы оба класса, std : ib it s e t и vector, какой из них вы предпочли бы для хранения бинарных флагов?
Класс s t d : : b i t s e t , поскольку он лучше всего подходит для этого требования.
У меня есть объект myBitSeq класса std : :b itse t, хранящий определенное коли чество битов. Как мне определить количество битов со значением 0 (или f a ls e ) ?
Метод b i t s e t :: c o u n t () возвращает количество битов со значением 1. Вычтя это зна
чение из значения, возвращенного методом b i t s e t : : s i z e ( ) (полное количество хра нимых битов), получим количество 0 в последовательности.
Могу ли я использовать итераторы для доступа к индивидуальным элементам в объекте класса vector?
Да. П оскольку класс v e c t o r < b o o l > — это частичная специализация класса s t d : : v e c to r , а он поддерживает итераторы.
Могу ли я во время компиляции задать количество элементов, которые будут хра ниться в объекте класса vector?
Да, либо указав количество в перегруженном конструкторе, либо используя функцию v e c to r < b o o l> :: r e s i z e позднее.
Коллоквиум
этом разделе предлагаются вопросы для самоконтроля и закрепления полученных знаний, а также упражнения, которые помогут применить на практике полученные навы ки. Попытайтесь самостоятельно ответить на эти вопросы и выполнить задания, а потом сверьте полученные результаты с ответами в приложении Г, “Ответы”. Если остались не ясными хотя бы некоторые из предложенных ниже вопросов, не приступайте к изучению материала следующего занятия.
Контрольные вопросы
Может ли набор битов расширить свой внутренний буфер для хранения переменно го количества элементов?
Почему класс b i t s e t не считается контейнерным классом библиотеки STL?
Использовали бы вы класс s t d :: v e c to r для хранения фиксированного количества битов, известного на момент компиляции?
570 ЗАНЯТИЕ25.РаботасбитовымифлагамиприиспользованиибиблиотекиЗТ1-
Упражнения
Напишите пример, где набор битов содержит четыре бита. Инициализируйте его, отобразите результат и добавьте его к другому набору битов. (Предостережение:
наборы битов не допускают такой синтаксис: b i t s e t A = b i t s e t X + b its e tY . )
2. Покажите, как бы вы инвертировали биты в наборе битов.
ЧАСТЬ V
Передовые
концепции
языка C++
ЗАНЯТИЕ 26. Понятие интеллектуальных указателей ЗАНЯТИЕ 27. Применение потоков для ввода и вывода ЗАНЯТИЕ 28. Обработка исключений ЗАНЯТИЕ 29.Что дальше
ЗАНЯТИЕ 26
Понятие
интеллектуальных
указателей
Программисты C++ не обязаны использовать простые ссылочные типы при управлении распределяемой памятью (или динамической па мятью); они могут использовать интеллектуальные указатели.
На сегодняшнем занятии.
■ Что такое интеллектуальный указатель и зачем он нужен.
■ Как реализуются интеллектуальные указатели.
■ Типы интеллектуальных указателей.
■ Почему не стоит использовать устаревший тип std: :auto_ptr.
■ Интеллектуальный указатель std: :unique_ptr стандартной библиотеки С++11.
■ Популярные библиотеки интеллектуальных указателей.
ЗАНЯТИЕ 26
Понятие
интеллектуальных
указателей
Программисты C++ не обязаны использовать простые ссылочные типы при управлении распределяемой памятью (или динамической па мятью); они могут использовать интеллектуальные указатели.
На сегодняшнем занятии.
■ Что такое интеллектуальный указатель и зачем он нужен.
■ Как реализуются интеллектуальные указатели.
■ Типы интеллектуальных указателей.
■ Почему не стоит использовать устаревший тип std: :auto_ptr.
■ Интеллектуальный указатель std: :unique_ptr стандартной библиотеки С++11.
■ Популярные библиотеки интеллектуальных указателей.
574 ЗАНЯТИЕ 26. Понятие интеллектуальных указателей
Do'stlaringiz bilan baham: |