|
Программирование >> Операторы преобразования типа
Операции сравнения определены только для однотипных контейнеров. Это означает совпадение как типов элементов, так и критерия сортировки; в противном случае происходит ошибка компиляции. Пример: std::set<float> cl; Критерий сортировки: std::less<> std::set<float.std;:greater<float> > c2: If (cl == c2) { ОШИБКА: разные типы } Отношение меньше/больше между контейнерами проверяется по лексикографическому критерию (см. с. 356). Для сравнения контейнеров разных типов (с разными критериями сортировки) необходимо использовать алгоритмы, описанные на с. 352. Специальные операции поиска Множества и мультимножества оптимизированы для поиска элементов, поэтому в этих контейнерах определены специальные функции поиска (табл. 6.22), Эти функции представляют собой оптимизированные версии одноименных универсальных алгоритмов. Всегда используйте оптимизированные версии функций для множеств и мультимножеств, обеспечивающие логарифмическую сложность вместо линейной сложности универсальных алгоррггмов. Например, поиск в коллекции из 1000 элементов требует в среднем 10 сравнений вместо 500 (см. с. 37). Таблица 6.22. Специальные операции поиска в множествах и мультимножествах Операция Описание count(elem) Возвращает количество элементов со значением elem find(eiem) Возвращает позицию первого элемента со значением eienn (или end()) iower bound(eiem) Возвращает первую позицию, в которой может быть вставлен элемент elem (первый элемент >= eienn) upper bound(eiem) Возвращает последнюю позицию, в которой может быть вставлен элемент elem (первый элемент > elem) equal range(eiem) Возвращает первую и последнюю позиции, в которых может быть вставлен элемент elem (интервал, в котором элементы == elem) Функция find() ищет первый элемент, значение которого передается в аргументе, и возвращает его позицию в виде итератора. Если поиск оказывается безуспешным, функция find() возвращает end(). Функции lower bound() и upper bound() возвращают соответственно первую и последнюю позиции, в которых может быть вставлен элемент с заданным значением. Иначе говоря, lower bound() возвращает позицию первого элемента, значение которого больше либо равно аргументу, а функция upper bound() возвращает позицию последнего элемента, значение которого больше аргумента. Функция equaLrangeO возвращает значения lower bound() и upper bound() в виде объекта типа pair (тип pair описан на с. 50). Таким образом, фзшкция возвращает интервал элементов, значения которых равны переданному аргументу. Если lower bound() или первый компонент equal range() совпадает с upper bound() или вторым компонентом equaLrangeO, то в множестве или мультимножестве отсутствуют элементы с заданным значением. Естественно, в множестве интервал едиа1 гапде() содержит не более одного элемента. Следующий пример демонстрирует применение функций lower bound(), upper boundO и equal range(). cont/set2.cpp #1nclude <iostream> #1nclude <set> using namespace std: int main () { set<1nt> c; c.Insert(1) c.1nsert(2) c.1nsert(4) c.insert(5) c.1nsertC6) cout lower bound(3) cout upper bound(3) cout equal rangeC3) cout endl: cout lower boundC5) cout upper bound(5) cout equal range(5) *c.lQwer bound(3) endl; *c.upper bound(3) endl; *c.equal rangeC3).first *c.equal range(3).second endl *c.lower boundC5) endl: *c.upper boundC5) endl: *c.equal range(5).first *c.equal rangeC5).second endl Результат выполнения программы выглядит так: lower bound(3): 4 upper bound(3): 4 equal ranqe (3): 4 4 lower bound(5): 5 upper bound(5): 5 equal range (5): 5 6 Если вместо множества использовать мультимножество, результат останется прежним. Присваивания в множествах и мультимножествах определены только базовые операции присваивания, поддерживаемые всеми контейнерами (табл. 6.23). Дополнительная информация приведена на с. 156. Таблица 6.23. Операции присваивания для множеств и мультимножеств Операция Описание с1 = с2 Присваивает с1 все элементы с2 cl.swap(c2) Меняет местами содержимое с1 и с2 swap(cl,с2) То же, но в форме глобальной функции Для выполнения операций присваивания контейнеры должны относиться к одному типу. В частности, должны совпадать типы критериев сравнения, хотя сами критерии могут различаться. Пример использования разных критериев сортировкн, относящихся к одному типу, приведен на с. 198, Если критерии различаются, в результате присваивания или перестановки они также меняются местами. Функции получения итераторов Множества и мультимножества не обеспечивают прямого доступа к элементам, поэтому для такого доступа приходится использовать итераторы. Множества и мультимножества поддерживают стандартный набор операций для получения итераторов (табл. 6.24). Таблица 6.24. Операции получения итераторов для множеств и мультимножеств Операция Описание cbeginO Возвращает двунаправленный итератор для первого элемента (элементы считаются константными) C.endO Возвращает двунаправленный итератор для позиции за последним элементом (элементы считаются константными) C.rbeginO Возвращает обратный итератор для первого элемента при переборе в обратном направлении C.rendO Возвращает обратный итератор для позиции за последним элементом при переборе в обратном направлении Множества и мультимножества, как и все остальные классы ассоциативных контейнеров, поддерживают двунаправленные итераторы (см. с. 261). Такие итераторы не могут использоваться алгоритмами, рассчитанными на итераторы произвольного доступа (например, сортировки или случайной перестановки злементов). Но еще более важное ограничение заключается в том, что с точки зрения итератора все элементы считаются константными. Это необходимо для того, чтобы программа ие могла нарушить порядок следования элементов, изменяя их значения. Однако в результате для элементов множества или мультимножества вызов модифицирующих алгоритмов становится невозможным. Например, удаление элементов не может осуществляться алгоритмом remove(), потому что уда./1ение в действительности сводится к перезаписи следующими элементами
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |