Оценка числа элементов и размеров контейнера 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Оценка числа элементов и размеров контейнера



 

метод пояснение
size() возвращает фактическое количество элементов в контейнере
max_size() возвращает максимальный размер контейнера (порядка миллиарда элементов)
empty() возвращает значение true, если контейнер пуст

 

Сравнение контейнеров

Для однотипных контейнеров сравнение может быть выполнено с помощью стандартных операций отношений ==,!=, <, <=, >, >=.

Отношения <, <=, >, >= проверяются по лексикографическому критерию. В этом случае два контейнера сравниваются с учетом интервалов размещения элементов [beg1, end1) и [beg2, end2). Элементы из интервалов сравниваются попарно до тех пор, пока не будет выполнено одно из условий:

· если очередные два элемента не равны, то результат этих элементов сравнения определяет результат сравнения контейнеров;

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

Присваивание контейнеров и обмен содержимым

Все типы контейнеров имеют общие операции вставки и удаления:

метод содержание
swap(T& left, T& right) обмен содержимым элементов контейнера
insert (iterator position, const T& value) вставка элемента со значением value в позицию, заданную итератором position
insert (iterator position, size_type n, const T& value) вставка n элементов со значением value, начиная с позиции position
insert (iterator position, const_iterator first, const_iterator last) вставка диапазона элементов, заданного итераторами first и last, начиная с позиции position
erase(iterator position) удаление элемента, на который указывает итератор position
erase(iterator first, iterator last) удаление диапазона элементов, заданного позициями first и last
clear() удаление всех элементов контейнера, но не его самого

 

Методы частного применения

 

push_back() – вставка элемента в конец контейнера; применим к деку, вектору, списку.

push_front() – вставка элемента в начало контейнера; применим к деку, списку.

 

pop_back() – удаление последнего элемента контейнера; применим к деку, вектору, списку.

pop_front() – удаление элемента из начала контейнера; применим к деку, списку

Методы pop_back() и pop_front() не возвращают удаленное значение.

Для считывания первого элемента используется метод front(), а для считывания последнего элемента – метод back().

 

Контейнер vector эффективно обрабатывает произвольную выборку элементов с помощью операции индексации [] или метода at, который аналогичен операции индексации, но в отличие от нее проверяет выход за границу вектора (генерирует исключение out_of_range, если такое нарушение обнаруживается).

 

Действия методов вставки и удаления:

 

push_back() push_front()

элементы последовательности

                                                       

 

pop_back() pop_front()

 

Применение представленных в таблице методов дает разную эффективность для разных контейнеров:

Название операции метод vector deque list
добавление в начало push_front() - O(1) O(1)
удаление из начала pop_front() - O(1) O(1)
добавление в конец push_back() O(1)+ O(1) O(1)
удаление из конца pop_back() O(1)+ O(1) O(1)
вставка в произвольное место insert() O(n)+ O(n) O(1)
удаление из произвольного места erase() O(n)+ O(n) O(1)
обращение по индексу с проверкой допустимости at() O(1) O(1) -
обращение по индексу без проверки допустимости [ ] O(1) O(1) -
доступ к первому элементу front() O(1) O(1) O(1)
доступ к последнему элементу back() O(1) O(1) O(1)

 

Обозначения в таблице:

O(1) – длительность операции не зависит от числа элементов в контейнере;

O(n) – длительность операции пропорциональна числу элементов в контейнере;

+ – суффикс, обозначающий, что длительность исполнения операции может возрастать;

- – неприменимость операции к контейнеру.

Итераторы

Каждый контейнер включает тип с названием итератор.В шаблоне контейнера с параметром Т этому типу соответствуют Т* или const Т*, т.е. итератор ведет себя как указатель на элемент, помещенный в контейнер. Итератор – объект, по своим функциям напоминающий указатель при работе с массивом, аналог указателя на элемент. Он используется для обеспечения доступа к элементам контейнера, для просмотра контейнера в прямом или обратном направлении. От него требуется умение ссылаться на элемент контейнера и реализовывать операции перехода к следующему элементу. При помощи итераторов можно просматривать контейнеры, не заботясь о фактических типах данных, используемых для доступа к элементам. Константные итераторы используются тогда, когда значений соответствующих элементов контейнера не изменяются.

Существуют итераторы:

· однонаправленные (прямые); если нужно продвигаться вперед, но при этом совершать как запись, так и чтение, используется «прямой» итератор;

· двунаправленные;

· обеспечивающие произвольное перемещение (произвольный доступ); итератор «произвольного доступа» обеспечивает доступ к элементу контейнера без всяких продвижений.

 

Имеются два специализированных типа итераторов:

· потоковые итераторы, благодаря которым входные и выходные потоки могут вести себя как итераторы:

§ ostream_iterator – итератор выходного потока; используется, если требуется только лишь продвинуться на один шаг по контейнеру для осуществления последовательной записи, например, при записи в файл или выводе на экран;

§ istream_iterator – итератор входного потока; используется, если требуется только лишь продвинуться на один шаг по контейнеру. для осуществления последовательного чтения, например, при чтении из файлов или с клавиатуры.

 

· адаптеры итераторов – варианты модификации обычного итератора, которые могут необычным способом изменять поведение обычных итераторов:

o обратный итератор (reverse_iterator) для реверсного прохода контейнера (в обратном направлении);

o итератор вставки:

§ back_inserter вставляет новые элементы в конец контейнера

§ front_inserter вставляет новые элементы в начало контейнера (кроме вектора)

§ inserter вставляет новые элементы в указанное место

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

 

Тип итератора Шаг вперед ++ Шаг назад -- Чтение value=*i Запись *i= value Произвольный доступ
Произвольного доступа х х х х х
Двунаправленный х х х х  
Однонаправленный х   х х  
Входной х   х    
Выходной х     х  

 

 

Для просмотра контейнеров с помощью итераторов в каждом контейнере определены методы:

 

метод пояснение
iterator begin() const_iterator begin() const указывают на первый элемент
iterator end() const_iterator end() const указывают на элемент, следующий за последним
reverse_iterator rbegin() const_reverse_iterator rbegin() const указывают на первый элемент в обратной последовательности, который инкрементируется (при использовании обратного итератора)
reverse_iterator rend() const_reverse_iterator rend() const указывают на элемент, следующий за последним, в обратной последовательности (при использовании обратного итератора)

 

Алгоритмы

Алгоритм – независимая шаблонная функция, производящая действия над элементами контейнера (для ее использования к программе подключается заголовочный файл <algorithm>). Алгоритмы можно использовать и при работе с обычными массивами С++.

Наиболее популярные алгоритмы STL:

название назначение аргументы
adjacent_find поиск смежных пар одинаковых значений в последовательности; возвращает итератор первой пары поиск смежных пар одинаковых значений в последовательности, удовлетворяющих заданному предикатом условию в виде функции; возвращает итератор первой пары first, last     first, last, predicate
accumulate вычисление суммы элементов в заданном диапазоне; последовательное применение к каждому объекту диапазона формулы: init= init+*iter first, last, init
binary_search бинарный поиск в упорядоченной последовательности first, last, val first, last, val, predicate
сopy копирование объектов из первого диапазона во второй first1, last1, first2
copy_backward копирование объектов из первого диапазона во второй, располагая их в обратном порядке от last2 к first2 first1, last1, first2
count возвращает количество вхождений n элемента value в последовательность first, last, value, n
count_if подсчет количества n выполнений в последовательности условия, удовлетворяющего значению predicate first, last, predicate, n
еqual определяет идентичность двух диапазонов; определяет идентичность двух диапазонов в соответствии с условием first1, last1, first2 first1, last1, first2, predicate
fill заменяет все элементы заданным значением value
fill_n заполняет диапазон от first до first+n заданным значением value first, n, value
find возвращает итератор, указывающий на первый объект, равный значению value first, last, value
find_if возвращает итератор, указывающий на первый объект, для которого условие принимает значение true first, last, predicate
find_end поиск конца последовательности [first2, last2] внутри диапазона [first1, last1] поиск конца последовательности [first2, last2] для некоторого условия внутри диапазона [first1, last1] first1, last1, first2, last2   first1, last1, first2, last2, predicate  
find_first_of нахождение первого значения из одной последовательности в другой нахождение первого значения из одной последовательности в другой в соответствии с условием first1, last1, first2, last2   first1, last1, first2, last2, predicate  
for_each вызов function для каждого элемента последовательности first, last, function
generate присваивает всем элементам значения, получаемые с помощью последовательных вызовов функции gen first, last, gen
generate_ n присваивает всем элементам диапазона от first до first+n значения, получаемые с помощью последовательных вызовов функции gen first, n, gen
includes определяет, включает ли одна последовательность все элементы другой последовательности определяет, включает ли одна последовательность все элементы другой последовательности в соответствии с условием first1, last1, first2, last2     first1, last1, first2, last2, predicate  
inplace_merge слияние диапазонов, отсортированных в порядке возрастания элементов; слияние диапазонов, отсортированных в соответствии с условием first, middle, last   first, middle, last, predicate  
iter_swap меняет местами значения left, right
lexicographical_compare лексикографическое сравнение последовательностей лексикографическое сравнение последовательностей в соответствии с условием first1, last1, first2, last2   first1, last1, first2, last2, predicate
lower_bound нахождение первого значения в последовательности, которое не меньше заданного value value
max возвращает максимальный из двух элементов value1, value2
max_element возвращает итератор максимального элемента внутри диапазона возвращает итератор максимального элемента внутри диапазона в соответствии с условием first, last   first, last, predicate
merge соединяет отсортированные диапазоны 1 и 2 в диапазон 3 соединяет отсортированные диапазоны 1 и 2 в диапазон 3; порядок сортировки определяется функцией comp first1, last1, first2, last2, first3   first1, last1, first2, last2, first3, comp
min возвращает минимальный из двух элементов value1, value2
min_element возвращает итератор минимального элемента внутри диапазона возвращает итератор минимального элемента внутри диапазона в соответствии с условием first, last   first, last, predicate
mismatch поиск первого несовпадения между элементами двух последовательностей; возвращаются итераторы несовпадающих элементов поиск первого несовпадения между элементами двух последовательностей в соответствии с условием; возвращаются итераторы несовпадающих элементов first1, last1, first2   first1, last1, first2, predicate  
remove удаляет из диапазона все объекты, равные value first, last, value
remove_copy копирует все объекты, не равные значению value, из диапазона 1 в диапазон 2 first1, last1, first2, value
remove_copy_if копирует все объекты, не удовлетворяющие predicate, из диапазона 1 в диапазон 2 first1, last1, first2, predicate
replace заменяет все объекты, равные old, объектами, равными new first, last, old, new
replace_if заменяет все объекты, удовлетворяющие predicate, объектами, равными new first, last, predicate, new
replace_copy производит копирование из диапазона 1 в диапазон 2, заменяя все объекты, равные old, объектами, равными new first1, last1, first2, old, new
replace_copy_if производит копирование из диапазона 1 в диапазон 2, заменяя все объекты, удовлетворяющие predicate, объектами, равными new first1, last1, first2, predicate, new
reverse обращает последовательность элементов из диапазона first, last
reverse_copy копирует объекты из диапазона 1 в диапазон 2 в обратном порядке first1, last1, first2
search проверяет, содержится ли второй диапазон внутри первого; возвращает начало совпадения или last1, если нет совпадения first1, last1, first2, last2
search проверяет, содержится ли второй диапазон внутри первого, равенство определяется по predicate; возвращает начало совпадения или last1, если нет совпадения first1, last1, first2, last2, predicate
sort сортирует объекты в диапазоне first, last
sort сортирует объекты в диапазоне, используя comp в качестве функции сравнения first, last, comp
swap заменяет один объект другим a, b
iter_swap обменивает объекты, на которые указывают два итератора iter1, iter2
swap_ranges обменивает соответствующие объекты в двух диапазонах first1, last1, first2

 

В списках параметров всех алгоритмов первые два параметра задают диапазон обрабатываемых элементов в виде полуинтервала [first, last), где first – итератор, указывающий на начало диапазона, а last – итератор, указывающий на выход за границы диапазона, т.е. на элемент, располагающийся за последним.

Например, массив int arr[7] = {15, 2, 19, -3, 28, 6, 8};

можно отсортировать с помощью алгоритма sort: sort (arr, arr +7);

Здесь имя массива arr (имеющее тип указателя int*) используется как итератор.

Примеры



Поделиться:


Последнее изменение этой страницы: 2016-12-17; просмотров: 276; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.78.149 (0.019 с.)