
- •«Объектно-ориентированный анализ и проектирование»
- •1. Принципы ооп. Классы.
- •Описание классов.
- •Объекты класса.
- •Конструкторы
- •Конструктор копирования
- •Статические элементы класса
- •Дружественные функции и классы
- •Деструкторы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Рекомендации по составу классов
- •2. Наследование
- •Ключи доступа
- •Простое наследование
- •Пример замещения функций (практикум)
- •Виртуальные методы
- •Множественное наследование
- •3. Отношения между классами. Диаграммы класссов на языке uml.
- •4. Шаблоны классов.
- •4.1. Определения шаблонов классов Queue и QueueItem
- •4.2. Конкретизация шаблона класса
- •4.3. Аргументы шаблона для параметров-констант
- •4.4. Функции-члены шаблонов классов
- •5. Обработка исключительных ситуаций
- •5.1. Общий механизм обработки исключений.
- •5.2 . Синтаксис исключений
- •5.3. Перехват исключений
- •5.4. Исключения в конструкторах и деструкторах
- •Vector(int n) // Конструктор
- •5.5. Список исключений функции.
- •6. Строки
- •Преобразование строк
- •7. Контейнерные классы
- •7.1. Векторы.
- •7.2. Двухсторонние очереди (deque).
- •7.3. Списки (List).
- •7.4. Стеки
- •7.5. Очереди (queue)
- •7.6. Очередь с приоритетами(priority_queue)
- •8. Ассоциативные контейнеры
- •8.1. Словари (map)
- •8.2. Словари с дубликатами (multimap)
- •8.3. Множества (set)
- •8.4. Множества с дубликатами (multiset)
- •8.5. Битовые множества (bitset)
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