Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Пример использования стека. (программа вводит из файла числа и выводит их на экран в обратном порядке)

#include <fstream>

#include <vector>

#include <stack>

using namespace std:

int main(){

ifstream in ("inpnum"):

stack <int. vector<int> > s:

int x:

while ( in » x. !in. eof()) s. push(x):

while (! s. empty()){

X = s. top(); cout << X « " ":

s.pop():

}

}

Очереди (queue). Для очереди допускаются две операции, изменяющие ее размер — добавление элемента в конец и выборка из начала. Очередь является адаптером, который можно реализовать на основе двусторонней очереди или списка (вектор не подходит, поскольку в нем нет операции выборки из начала).

В STL очередь определена по умолчанию на базе двусторонней очереди.

template <class Т. class Container = cleque<T> >

class queue {

protected:

Container c:

public:

explicit queueCconst Containers = Container()):

bool empty() const (return c. empty():}

size_type size() const {return c. size();}

value_type& front() {return c. front():}

const value_type& front () const (return c. front():}

value_type& back () (return c. back():}

const value_type& back () const (return c. back():}

void push(const value_type& x) (c. push_back(x):}

void pop() {c. pop_front():}

}:

Методы front и back используются для получения значений элементов, находящихся соответственно в начале и в конце очереди (при этом элементы остаются в очереди).

Пример работы с очередью (программа вводит из файла числа в очередь и выполняет выборку из нее, пока очередь не опустеет):

НЕ нашли? Не то? Что вы ищете?

#include <fstream>

#include <list>

#include <queue>

using namespace std:

int main(){

ifstream in ("inpnum"):

queue <int. list<int> > q:

int x:

while ( in » x. lin. eof()) q. push(x):

cout « "q. front(): " « q. front () « " ":

cout « "q. back(): " « q. back() « endl:

while (! q. empty()){

q. pop():

cout « "q. front(): " « q. front() « " ":

cout « "q. back(): " « q. back() « endl:

}

}

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

Для реализации очереди с приоритетами подходит контейнер, допускающий произвольный доступ к элементам, то есть, например, вектор или двусторонняя очередь.

Для элементов с равными приоритетами очередь с приоритетами является простой очередью. Как и для стеков, основными методами являются push, pop и top.

11.3. Ассоциативные контейнеры

Ассоциативные контейнеры обеспечивают быстрый доступ к данным за счет того, что они построены на основе сбалансированных деревьев поиска (стандартом регламентируется только интерфейс контейнеров, а не их реализация).

Существует пять типов ассоциативных контейнеров: словари (тар), словари с дубликатами (multimap), множества (set), множества с дубликатами (multiset) и битовые множества (bitset). Словари часто называют также ассоциативными массивами или отображениями.

Словарь построен на основе нар значений, первое из которых представляет собой ключ для идентификации элемента, а второе — собственно элемент. Можно сказать, что ключ ассоциирован с элементом, откуда и произошло название этих контейнеров. Например, в англо-русском словаре ключом является английское слово, а элементом — русское. Обычный массив тоже можно рассматривать как словарь, ключом в котором служит номер элемента. В словарях, описанных в STL, в качестве ключа может использоваться значение произвольного типа.

Ассоциативные контейнеры описаны в заголовочных файлах <тар> и <set>.

1. Словари (map). В словаре (тар), в отличие от словаря с дубликатами (multimap), все ключи должны быть уникальны. Элементы в словаре хранятся в отсортированном виде, поэтому для ключей должно быть определено отношение «меньше». Шаблон словаря содержит три параметра: тип ключа, тип элемента и тип функционального объекта, определяющего отношение «меньше».

2. Словари с дубликатами (multimap). Словари с дубликатами допускают хранение элементов с одинаковыми ключами. Поэтому для них не определена операция доступа по индексу [ ], а добавление с помощью функции insert выполняется успешно в любом случае. Функция возвращает итератор на вставленный элемент. Элементы с одинаковыми ключами хранятся в словаре в порядке их занесения.

3. Множества (set). Множество — это ассоциативный контейнер, содержащий только значения ключей. Значения ключей должны быть уникальны. Шаблон множества имеет два параметра: тип ключа и тип функционального объекта, определяющего отношение «меньше».

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

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

Шаблон битового множества определен в заголовочном файле <bitset>. Конструкторы позволяют создать битовое множество из всех нулей, из значения типа long или из строки типа string.

12. Исключения

12.1. Понятие исключения

Исключительная ситуация, или исключение — это возникновение непредвиденного или аварийного события, которое может порождаться некорректным использованием аппаратуры. Например, это деление на ноль или обращение по несуществующему адресу памяти. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. C++ дает программисту возможность восстанавливать программу и продолжать ее выполнение.

Исключения C++ не поддерживают обработку асинхронных событий, таких, как ошибки оборудования или обработку прерываний, например, нажатие клавиш Ctrl+C. Механизм исключений предназначен только для событий, которые происходят в результате работы самой программы и указываются явным образом.

Исключения возникают тогда, когда некоторая часть программы не смогла сделать то, что от нее требовалось. При этом другая часть программы может попытаться сделать что-нибудь иное.

Исключения позволяют логически разделить вычислительный процесс на две части — обнаружение аварийной ситуации и ее обработка. Это важно не только для лучшей структуризации программы. Главной причиной является то, что функция, обнаружившая ошибку, может не знать, что предпринимать для ее исправления, а использующий эту функцию код может знать, что делать, но не уметь определить место возникновения. Это особенно актуально при использовании библиотечных функций и программ, состоящих из многих модулей.

Другое достоинство исключений состоит в том, что для передачи информации об ошибке в вызывающую функцию не требуется применять возвращаемое значение, параметры или глобальные переменные, поэтому интерфейс функций не раздувается. Это особенно важно, например, для конструкторов, которые по синтаксису не могут возвращать значение.

12.2. Обработка исключений

С++ обеспечивает встроенный механизм обработки ошибок, называемый обработкой исключительных ситуаций. Благодаря обработке исключительных ситуаций можно упростить управление и реакцию на ошибки времени исполнения. Обработка исключительных ситуаций в С++ строится с помощью трех ключевых слов: try, catch, throw. Операторы программы, во время выполнения которых вы хотите обеспечить обработку исключительных ситуаций, располагаются в блоке try. Если исключительная ситуация (ошибка) имеет место внутри блока try, она генерируется (с помощью throw). Перехватывается и обрабатывается исключительная ситуация с помощью ключевого слова catch.

Общий механизм обработки исключений

• Обработка исключения начинается с появления ошибки. Функция, в которой она возникла, генерирует исключение. Для этого используется ключевое слово throw с параметром, определяющим вид исключения. Параметр может быть константой, переменной или объектом и используется для передачи информации об исключении его обработчику.

• Отыскивается соответствующий обработчик исключения и ему передается управление.

• Если обработчик исключения не найден, вызывается стандартная функция terminate, которая вызывает функцию abort, аварийно завершающую текущий процесс. Можно установить собственную функцию завершения процесса.

Синтаксис исключений. Ключевое слово try служит для обозначения контролируемого блока — кода, в котором может генерироваться исключение. Блок заключается в фигурные скобки:

try{

}

Все функции, прямо или косвенно вызываемые из try-блока, также считаются ему принадлежащими.

Генерация (порождение) исключения происходит по ключевому слову throw, которое употребляется либо с параметром, либо без него: throw [ выражение ];

Тип выражения, стоящего после throw, определяет тип порождаемого исключения. При генерации исключения выполнение текущего блока прекращается, и происходит поиск соответствующего обработчика и передача ему управления. Как правило, исключение генерируется не непосредственно в try-блоке, а в функциях, прямо или косвенно в него вложенных.

Не всегда исключение, возникшее во внутреннем блоке, может быть сразу правильно обработано. В этом случае используются вложенные контролируемые блоки, и исключение передается на более высокий уровень с помощью ключевого слова throw без параметров.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18