Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 33 34 35 [ 36 ] 37 38 39 ... 78


iterator begin О const; iterator end() const; iterator rbeginO const; iterator rendO const; bool empty 0 const; size type sized const; size type max size() const; void swap(set<Key, Compare>& x);

В программе setconst.cpp S\sizeQ = 0, a SlsizeQ = 2. Как обычно, функция maxsizeQ возвращает очень большое значение, например 3 214 748 364.

В разделе 2.10 на примере словарей мы рассматривали функцию insert, которая возвращает пару, составленную из итератора и булевского значения. Такая же функция существует и для множеств, и объявлена она так:

pair<iterator, bool> insert(const value type& x);

Возвращаемое функцией значение содержит итератор, указывающий на позицию значения х после добавления в рассматриваемое множество, а также значение типа bool, которое равно true в том случае, если произошло добавление х ко множеству, или false, если значение х уже присутствовало в множестве.

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

iterator insert(iterator position, const value type& x);

И наконец, существует функция insert, которая позволяет добавить сразу диапазон значений:

void insert(const value type* first, const value type* last);

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

insrange.cpp: Добавление диапазона значений, ♦include <iostream> ♦include <set> using namespace std;

int mainO

{ int a[3] = {20, 10, 20};



iterator find(const key type& х) const; iterator lower bound(const key type& x) const; iterator upper bound(const key type& x) const;

Как обычно, после выполнения i = S.find(x);

значение i равно S.endQ, если x не найдено, в противном случае *i равняется X. Чтобы найти минимальный диапазон [i,j) из множества S, содержащий X, мы можем написать

set<int, less<int> > S;

S.insert(a, a+2);

copy (S. begin!) , S.endO,

ostream iterator<int>(cout, ) ) ;

cout endl; Вывод 10 20

return 0;

Для удаления элементов множества определены три функции:

void erase(iterator position); 1

size type erase(const key type& x); 2

void erase(iterator first, iterator last); 3

Если мы знаем позицию удаляемого элемента, рекомендуется использовать первую функцию. Если известно только значение этого элемента, мы используем вторую; эта функция возвращает количество удаленных элементов, как правило 1, но может равняться О, если нужное значение отсутствует в множестве. Последняя из трех функций удаляет диапазон значений [first, last). Можно, следовательно, удалить все элементы множества S и сделать S пустым, написав

S. erase (S. begin О , S.endO);

Поскольку элементы множества уникальны (не может быть двух равных элементов), функция count, объявленная как

size type count(const key type& x) const;

возвратит либо О, либо 1. Например, если множеством целых чисел является S, выражение S.count{\23) принимает значение 1, когда 123 входит в множество S, и О, когда не входит.

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



i = S.lower bound(x);

j = S.upper bound(x);

*i = 30

*j = 30

*i = 30

*/ = 40

*i = 40

*j = 40

*i = 40

*j = 50

*i = 50

*j = 50

*i = 50

= S.endO

i = S.endO

j = S.end{)

Функция equal range возвращает рассматриваемую пару (г, j) за один вызов. Объявление этой функции дано ниже:

pair<iterator, iterator> equal range(const key type& x) const;

Вместо того чтобы вызывать отдельно lower bound и upperbound, как мы делали это выше с помощью операторов

i = S.lower bound(x); j = S.upper bound(x);

более эффективно находить inj с помощью equal range, как в приведенной ниже программе:

eqrange.cpp: Функция-член equal range. iinclude <set> iinclude <iostream> using namespace std;

int main()

{ typedef set<int, less<int> > settype; typedef settype::iterator iterator; settype S; S.insert(30); S.insert(40); S.insert (50) ;

pair<iterator, iterator> P;

i = S.lower bound(x); j = S.upper bound(x);

Для примера предположим, что S состоит из целых чисел 30, 40 и 50. Таблица ниже содержит значения i и j для разных значений х. Строки, в которых X = 25, 35, 45 и 55, показывают, что вызовы функций S.lower boundix) и S.upper bound{x) возвращают равные значения итераторов, если S не содержит х. Напротив, значения 30, 40 и 50 показывают, что возвращаемые итераторы различны, когда S содержит хг.



1 ... 33 34 35 [ 36 ] 37 38 39 ... 78

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