Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOAP.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
494.59 Кб
Скачать

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

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

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

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

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

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

template<size_t N> class bitset {. . .};

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

class reference {

friend class bitset;

reference();

public:

~reference();

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

Reference& operator= (const reference& x); // для b[i] = b [ j ];

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

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

reference& flip(); // для инверсии b[ i ];

};

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

Bitset(); // 1

bitset(unsigned long val); // 2

explicit bitset(const string& str, string::size_t pos = 0, string:: size_t n = string::npos); // 3

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

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

bitset <1б> b2 (OxfOf); // 0000111100001111

bitset <1б> bЗ ("ООООППООООПП"); // 0000111100001111

bitset <5> b4 ("00110011", 3); // 10011

bitset <3> b5 ("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>& operator^=(const bitset<N>& rhs);

bitset<N> operator<<(size_t pos) const;

bitset<N> operator>>(size_t pos) const;

bitset<N>& operator<<=(size_t pos);

bitset<N>& operator>>=(size_t pos);

bitset<N>& set();

bitset<N>& set(size_t pos, int val = true);

bitset<N>& reset();

bitset<N>& reset(size_t pos);

bitset<N> operator~() const;

bitset<N>& flip();

bitset<N>& flip(size_t pos);

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

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

или бита, заданного параметром роs.

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

В шаблоне bitset определены методы преобразования в длинное целое и в строку, а также анализа значений множества:

unsigned long to_ulong() const; // в unsigned long

string to_string() const; // в string

size_t count() const; // количество битовых 1

size_t size() const; // количество битов

bool test(size_t pos) const; // true, если b[pos] == 1

bool any() const; // true, если хотя бы один бит равен 1

bool none() const; // true, если ни один бит не равен 1

Определены также обычные операции ввода и вывода << и >> . Биты множества выводятся с помощью символов '0' и '1' слева направо, самый старший бит слева.

В битовом множестве не определены итераторы, поэтому оно не является контейнером в чистом виде, поскольку не полностью обеспечивает стандартный интерфейс контейнеров.

#include<iostream> #include<bitset> #include<string> using namespace std; int main() {

bitset<8> b1(8); // 00001000

string s1 = "00110110";

bitset<5> b2(s1, 3); //10110

string s2 = "01011010";

bitset<6> b3(s2, 1, 6); // 101101

bitset<8> b4;

if(b4.none())

cout << "All nulls\n";

if(bl.any())

cout << b1 << '\n';

cout << b2.size() << '\n';

cout << b3.count() << '\n';

b3 <<= 1; //011010

cout << b3 << '\n';

cout << ~b2 << '\n';

cout << b2.flip() << '\n';

return 0;

}

Вывод на экран:

All nulls

00001000

5

4

011010

01001

01001

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]