Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
67
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 12. Контейнерные классы

323

Множества с дубликатами (multiset)

Во множествах с дубликатами ключи могут повторяться, поэтому операция вставки элемента всегда выполняется успешно, и функция insert возвращает итератор на вставленный элемент. Элементы с одинаковыми ключами хранятся в словаре в порядке их занесения. Функция find возвращает итератор на первый найденный элемент или end(), если ни одного элемента с заданным ключом не найдено.

При работе с одинаковыми ключами в multiset часто пользуются функциями count, lower_bound, upper_bound и equal_range, имеющими тот же смысл, что и для словарей с дубликатами.

Битовые множества (bitset)

Битовое множество представляет собой шаблон для представления и обработки длинных последовательностей битов1. Фактически bitset — это битовый массив, для которого обеспечиваются операции произвольного доступа, изменения отдельных битов и всего массива. Биты нумеруются справа налево, начиная с 0.

Шаблон битового множества определен в заголовочном файле <bitset>. Параметром шаблона является длина битовой последовательности, которая должна быть константой:

tempi ate<size_t N> class bitset {...};

Для адресации отдельного бита в bitset введен класс reference:

class reference {

friend class bitset:

referenceO:

public:

-referenceO:

references operator=(bool x); // для b[i] = x;

references operator=(const references): // для b[i] = b[j]:

bool operator~() const: // инверсия b[i]

operator boolО const: // для х = b[i];

references flipO; // для инверсии b[i]:

}: Конструкторы позволяют создать битовое множество из всех нулей, из значения типа long или из строки типа string2:

bitsetO: III

bitset(unsigned long val): // 2

1 Может оказаться, что в зависимости от реализации битовые последовательности, для размещения которых недостаточно переменной типа int, но достаточно long, более эф фективно обрабатывать с помощью битовых операций над целыми числами (см. 31). Короткие последовательности, умещающиеся в одном слове, могут обрабатываться с по мощью битового множества более эффективно.

2 Описание конструкторов приведено с сокращениями.

324

Часть III. Стандартная библиотека

explicit bitset(const string& str. // 3

string::size_tyре pos = 0. string::size_type n = string::npos):

Первый конструктор создает битовое множество из нулей, второй принимает значение типа long и инициализирует каждый бит множества соответствующим битом внутреннего представления этого значения. Третий конструктор принимает строку, которая должна состоять из нулей и единиц (если это не так, порождается исключение invalid_argument) и инициализирует каждый бит множества в соответствии со значением символа строки. Второй и третий параметры конструктора задают позиции начала строки и количества символов, которые используются для инициализации. По умолчанию используется вся строка.

Примеры создания битовых множеств:

bitset <100> Ы; // сто нулей

bitset <1б> Ь2 (OxfOf): // 0000111100001111

bitset <1б> ЬЗ ГООООШЮОООШГ); // 0000111100001111

bitset <5> Ь4 ("00110011". 3): // 10011

bitset <3> Ь5 ("00110101". 1. 3): // 011

С битовыми множествами можно выполнять следующие операции:

bool operator==(const bitset<N>& rhs) const:

bool operator!=(const bitset<N>& rhs) const:

bitset<N>& operator&=(const bitset<N>& rhs):

bitset<N>& operator|=(const bitset<N>& rhs):

bitset<N>& operatorA=(const bitset<N>& rhs):

bitset<N> operator«(size_t pos) const:

bitset<N> operator»(size_t pos) const:

bitset<N>& operator«=(sizeJ: pos):

bitset<N>& operator»=(size_t pos):

bitset<N>& set():

bitset<N>& set(size_t pos. int val = true):

bitset<N>& resetO:

bitset<N>& reset(size_t pos):

bitset<N> operator~() const:

bitset<N>& flipO:

bitset<N>& flip(size_t pos):

reference operator[](size_t pos): // b[i];

Множества можно сравнивать на равенство (=) и неравенство (!=). Операции « и » создают битовые наборы, сдвинутые на pos бит влево или вправо соответственно. При сдвиге освобождающиеся позиции заполняются нулями. Операция set устанавливает все биты множества в 1, reset — в 0. Операция ~ создает дополнительный набор. С помощью flip можно инвертировать значение каждого бита или бита, заданного параметром pos.

Доступ к отдельному биту можно выполнять с помощью операции индексации. Если значение индекса выходит за границы набора, порождается исключение out_of_range.