Программирование >>  Операторы преобразования типа 

1 ... 56 57 58 [ 59 ] 60 61 62 ... 239


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

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

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

Однако при вставке нескольких злементов из-за необходимости сохранения упорядоченности полное восстановление после исключений становится непрактичным. Поэтому для всех одноэлементных операций вставки обеспечивается транзакционная безопасность (то есть такие операции либо завершаются успешно, либо пе вносят изменений). Кроме того, все миогоэлементные операции удаления всегда гарантированно завершаются успешно. Если в результате копирования/присваивания критерия сравнения возможны исключения, то функция swapO может их генерировать.

На с. 148 приведены общие сведения об обработке исключений в STL, а на с. 254 перечислены все контейнерные операции, для которых предоставляются особые гарантии в отношении исключений.

Примеры использования множеств и мультимножеств

Следующая программа демонстрирует некоторые возможности м}1ожеств:

cont/setl .срр #inclucle <iostream> #1nclucle <set> using namespace std:

Int mainO {

/* Тип коллекции:

* - дубликаты запрещены

* - элементы типа Int

* - сортировка по убыванию */

typedef set<int,greater<1nt> > IntSet: IntSet colli; Пустое множество

Определение distance() изменилось, поэтому в старых версиях STL приходится включать файл distance.hpp (см. с. 268).



Вставка элементов в произвольном порядке

colli coin coin colli coin colli coin

insertC4) 1nsertC3) insert(5) 1nsert(l) 1nsertC6) 1nsert(2) 1nsertC5)

Перебор и вывод всех элементов IntSet::iterator pos;

for (pos = colli.beginO: pos != colli.endO; ++pos) { cout *pos :

cout endl:

Попытка повторной вставки значения 4 и обработка возвращаемого значения pair<IntSet::iterator.bool> status = colli.insert(4): if (status.second) {

cout 4 Inserted as element

distance(colll,beginO.status.first) + 1 endl;

else {

cout 4 already exists endl:

Присваивание элементов другому множеству, упорядоченному по возрастанию set<int> со112(со1П.beginO.

colli.endO);

Вывод всех элементов копии сору (C0112.beginO. coll2.end().

ostreamjterator<int>(cout, cout endl:

Удаление всех элементов до элемента со значением 3 С0112.erase (со112.beginO. coll2.f1nd(3));

Удаление всех элементов со значением 5 int num:

num = coll2.erase (5):

cout num element(s) removed endl:

Вывод всех элементов

copy (coll2.beginO. coll2.end().

ostrea)Ti iterator<1nt>(cout, )); cout endl:



Сначала определение типа создает сокращенное имя типа для множества целых чисел, упорядоченного по убыванию:

typedef set<1nt.gredter<int> > IntSet;

Затем мы создаем пустое множество и вставляем в него несколько элементов функцией insert():

IntSet colli: colU.1nsert(4);

Обратите внимание: элемент со значением 5 вставляется дважды. Вторая вставка игнорируется, поскольку дубликаты в множествах запрещены.

После вывода всех элементов программа снова пытается вставить элемент 4. На этот раз возвращаемое значение функции insert() обрабатывается способом, упомянутым па с. 192.

Следующая команда создает новое множество элементов типа int, упорядоченных по возрастанию, и инициализирует его элементами прежнего множества:

set<1nt> coll2(colll.beglnCJ, colli.endO):

Контейнеры используют разные критерии сортировки, поэтому их типы различаются, а прямое присваивание или сравнение невозможно, Тем не менее алгоритмы обычно способны работать с разными типами контейнеров, если типы их элементов совпадают или могут быть преобразованы друг к другу.

Следующая команда удаляет все э.леменгы, предшествующие элементу со значением 3:

С0112.erase (coll2.beg1n(), col 12.findC3));

При этом элемент со значением 3 находится на открытом кон[].с интервала и поэтому ие удаляется.

Наконец, из контейнера удаляются все элементы со значением 5:

1nt num:

num = С0112.erase (5);

cout num element(s) removed endl;

Результат выполнения программы выглядит так:

6 5 4 3 2 1

4 already exists

1 2 3 4 5 6

1 elementCs) removed

3 4 б

В приведенной команде задействованы некоторые новые возможности языка, а именно шаблоны функций класса и аргументы шаблонов по умолчанию. Если в вашей системе они НС поддерживаются, команда заменяется с;гедую1лнм фрагментом:

set<int.less<int> > со112:

сору (colli.beginC). colli.endO.

1nserter(coll2.coll2.begln())):



1 ... 56 57 58 [ 59 ] 60 61 62 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика