Удаление элементов контейнера
Нужно написать алгоритм, который удаляет из диапазона [first , last) все элементы, для которых значение предиката pr равно true. Удаленные элементы сдвигаются в конец контейнера. Возвращает итератор на первый удаленный элемент. Ведь итератор это указатель на элемент контейнера, и вот как через него удалять элементы? Подскажите, пожалуйста. Спасибо.
Отслеживать
207k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков
задан 18 ноя 2013 в 19:06
469 1 1 золотой знак 10 10 серебряных знаков 24 24 бронзовых знака
Трюк здесь в том, что std::remove_if ничего не удаляет, а просто переставляет элементы. Если не хотите ломать голову самостоятельно, то ключевые слова — remove_if и cppreference .
18 ноя 2013 в 20:47
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Эх, так вопрос и не получил канонического ответа.
Вы должны на самом деле воспользоваться идиомой erase/remove.
Код того, как надо делать, можно найти на cppreference:
std::string str = "Text\n with\tsome \t whitespaces\n\n"; str.erase(std::remove_if(str.begin(), str.end(), [](char x)), str.end());
std::remove_if перемещает ненужные элементы в конец, и возвращает итератор на первый из них. Так что удалять надо от этого итератора и до конца. Именно это и делает remove .
Для чего всё так сложно? Дело в том, что remove_if не знает ни о контейнере, ни о том, как удалить элемент по итератору. Поэтому он может лишь перемещать элементы.
Некоторые контейнеры (например, set / map ), не могут быть использованы таким образом, поскольку в них менять элемент по итератору запрещено, и remove не скомпилируется. Для них можно использовать такую конструкцию:
std::set s = ; for (auto it = s.begin(); it != s.end(); /**/) < if () it = s.erase(it); else ++it; >
Для других типов (например, list ) идиома erase/remove слишком неэффективна, и для них стоит пользоваться их собственной имплементацией remove_if .
Контейнер set (множество)
Множество — это структура данных, эквивалентная множествам в математике. Множество состоит из различных элементов заданного типа и поддерживает операции добавления элемента в множество, удаления элемента из множества, проверка принадлежности элемента множеству. Одно и то же значение хранится в множестве только один раз.
Для представления множеств в библиотеке STL имеется контейнер set , который реализован при помощи сбалансированного двоичного дерева поиска (красно-черного дерева), поэтому множества в STL хранятся в виде упорядоченной структуры, что позволяет перебирать элементы множества в порядке возрастания их значений. Для использования контейнера set нужно подключить заголовочный файл .
Подробней о возможностях контейнера set можно прочитать, например, на сайте cppreference.com.
В простейшем случае множество, например, данных типа int объявляется так:
Для добавления элемента в множество используется метод insert :
Для проверки принадлежности элемента множеству используется метод count . Этот метод возвращает количество вхождения передаваемого параметра в данный контейнер, но поскольку в множестве все элементы уникальные, то count для типа set всегда возвращает 0 или 1. То есть для проверки принадлежности значения x множеству S можно использовать следующий код:
Для удаления элемента используется метод erase . Ему можно передать значение элемента, итератор, указывающий на элемент или два итератора (в этом случае удаляется целый интервал элементов, содержащийся между заданными итераторами). Вот два способа удалить элемент x :
Метод size() возвращает количество элементов в множестве, метод empty() , возвращает логическое значение, равное true , если в множестве нет элементов, метод clear() удаляет все элементы из множества.
Итераторы
С итераторами контейнера set можно выполнять операции инкремента (что означает переход к следующему элементу) и декремента (переход к предыдущему элементу). Итераторы можно сравнивать на равенство и неравенство. Операции сравнения итераторов при помощи «», «> page_code_style»>begin() , который возвращает итератор на первый элемент множества, и метод e nd() , который возвращает фиктивный итератор на элемет, следующий за последним элементом в множестве. Таким образом, вывести все элементы множества можно так:
set ::iterator it;
for (it = S.begin(); it != S.end(); ++it)
Благодаря тому, что множества хранятся в упорядоченном виде, все элементы будут выведены в порядке возрастания значений.
В стандарте C++11 разрешается перебор всех элементом множества при помощи range-based цикла:
for (auto elem: S)
Элементы также будут выведены в порядке возрастания.
Для вывода элементов в порядке убывания можно использовать reverse_iterator аналогично векторам:
for (auto it = S.rbegin(); it != S.rend(); ++it)
Функции удаления элементов могут принимать итератор в качестве параметра. В этом случае удаляется элемент, на который указывает итератор. Например, чтобы удалить наименьший элемент:
Но для удаления последнего (наибольшего) элемента в set нельзя использовать reverse_iterator, нужно взять обычный итератор, указывающий на end(), уменьшить и удалить:
auto it = S.begin();
Поиск элемента в set
Для поиска конкретного элемента в set используется метод find . Этот метод возвращает итератор на элемент, а если элемент не найден, то он возвращает итератор end() (т.е. на фиктивный элемент, следующий за последним элементом множества. Используя этот метод проверить принадлежность элемента множеству можно так:
Также есть методы lower_bound и upper_bound , которые находят первых элемент, больше или равный x и первый элемент, строго больший x (аналогично двоичному поиску элемента в массиве).
Эти методы также возвращают итераторы, а если таких элементов (больше или равных или строго больших) нет в множестве, они возвращают end() .
Например, удалить из set минимальный элемент, строго больший x можно так:
auto it = S.upper_bound(x);
Особенности языков программирования
В этой статье будет дан обзор библиотеки STL с самого начального уровня, и до продвинутой, весьма полезной в ряде задач, функциональности.
Проще всего начать знакомство с STL со стандартных типов для хранения данных — контейнеров. Каждый раз, когда в программе возникает необходимость оперировать множеством элементов, в дело вступают контейнеры. Контейнер — это практическая реализация функциональности некоторой структуры данных. В языке C (не в C++) существовал только один встроенный тип контейнера: массив. Сам по себе массив имеет ряд недостатков: к примеру, размер динамически выделенного массива невозможно определить на этапе выполнения. Однако основной причиной для более внимательного ознакомления с контейнерами STL является отнюдь не вышеперечисленные недостатки массива. Истинная причина кроется несколько глубже. Дело в том, что в реальном мире структура данных, информацию о которых необходимо хранить, далеко не всегда удачно представима в виде массива. В большинстве случаев требуется контейнер несколько иной функциональности. К примеру, нам может потребоваться структура данных «множество строк», поддерживающая следующие функции:
— добавить строку к множеству;
— удалить строку из множества;
— определить, присутствует ли в рассматриваемом множестве данная строка;
— узнать количество различных строк в рассматриваемом множестве;
— просмотреть всю структуру данных, «пробежав» все присутствующие строки. Конечно, легко запрограммировать тривиальную реализацию функциональность подобной структуры данных на базе обычного массива. Но такая реализация будет крайне неэффективной. Для достижения приемлемой производительности имеет смысл реализовать хэш-таблицу или сбалансированное дерево, но задумайтесь: разве реализация подобной структуры данных (хэш либо дерево) зависит от типа хранимых объектов? Если мы потом захотим использовать ту же структуру не для строк, а, скажем, для точек на плоскости — какую часть кода придётся переписывать заново? Реализация подобных структур данных на чистом C оставляла программисту два пути. 1) Жёсткое решение (Hard-Coded тип данных). При этом изменение типа данных приводило к необходимости внести большое число изменений в самых различных частях кода. 2) По возможности сделать обработчики структуры данных независимыми от используемого типа данных. Иными словами, использовать тип void* везде, где это возможно. По какому бы пути реализации структуры данных в виде контейнера вы не пошли, скорее всего, никто другой ваш код понять, и тем более модифицировать, будет не в состоянии. В лучшем случае другие люди смогут им просто пользоваться. Именно для таких ситуаций существуют стандарты — чтобы программисты могли говорить друг с другом на одном и том же формальном языке. Шаблоны (Templates) в C++ предоставляют замечательную возможность реализовать контейнер один раз, формализовать его внешние интерфейсы, дать асимптотические оценки времени выполнения каждой из операций, а после этого просто пользоваться подобным контейнером с любым типом данных. Можете быть уверены: разработчики стандарта C++ так и поступили. В первой части курса мы на практике познакомимся с основными концепциями, положенными в основу контейнеров C++.
Класс set
Класс set контейнера стандартной библиотеки C++ используется для хранения и извлечения данных из коллекции. Значения элементов в наборе set уникальны и служат ключевыми значениями, в соответствии с которыми данные автоматически упорядочены. Значение элемента в элементе set может не изменяться напрямую. Вместо этого старые значения необходимо удалить и вставить элементы с новыми значениями.
Синтаксис
template , class Allocator=allocator> class set
Параметры
Key
Тип данных элемента для сохранения в наборе.
Traits
Тип, предоставляющий объект функции, который может сравнить два значения элемента как ключи сортировки, чтобы определить их относительный порядок в наборе. Этот аргумент является необязательным, и двоичный предикат less является значением по умолчанию.
В C++14 можно включить разнородный поиск, указав std::less<> или std::greater<> предикат, не имеющий параметров типа. Дополнительные сведения см . в разделе «Разнородный поиск» в ассоциативных контейнерах .
Allocator
Тип, представляющий сохраненный объект распределителя, который инкапсулирует сведения о выделении и освобождении памяти для набора. Этот аргумент является необязательным, и в качестве значения по умолчанию используется allocator .
Замечания
Набор стандартной библиотеки C++ — это:
- Ассоциативный контейнер, который является контейнером переменного размера, поддерживающим эффективное получение значений элементов на основе значения соответствующего ключа. Кроме того, это простой ассоциативный контейнер, так как его значения элементов являются ключевыми значениями.
- Является реверсивным, поскольку предоставляет двунаправленный итератор для получения доступа к его элементам.
- Сортированный, поскольку его элементы упорядочены по значениям ключей в контейнере в соответствии с заданной функцией сравнения.
- Является уникальным, поскольку каждый его элемент должен обладать уникальным ключом. Поскольку набор также является простым ассоциативным контейнером, его элементы также являются уникальными.
Набор также описывается как шаблон класса, так как функциональность, которая предоставляется, является универсальной и независимой от конкретного типа данных, содержащихся в виде элементов. Тип данных, подлежащий использованию, вместо этого определяется как параметры в шаблоне класса вместе с функцией и распределителем сравнения.
Выбор типа контейнера должен в общем случае производиться на основе типа поиска и вставки, который требуется приложению. Ассоциативные контейнеры оптимизированы для операций поиска, вставки и удаления. Функции-члены, которые явно поддерживают эти операции, эффективны, выполняя их в среднем пропорционально логарифму числа элементов в контейнере. Вставка элементов не делает итераторов и удаление элементов недействительными только тех итераторов, которые указали на удаленные элементы.
Набор рекомендуется использовать в качестве ассоциативного контейнера, если условия, ассоциирующие значения с ключами, удовлетворяются приложением. Элементы набора являются уникальным и используются в качестве своих собственных ключей сортировки. Модель для этого типа структуры — упорядоченный список, например, ключевых слов, в котором слова не должны повторяться. Если допускается повторное использование слов, то подходящей структурой контейнера будет multiset. Если значения вносятся в список уникальных ключевых слов, сопоставление является подходящей структурой для размещения этих данных. Если вместо этого ключи не являются уникальными, то мультикарта будет контейнером выбора.
Набор упорядочивает последовательность, которую он управляет путем вызова объекта хранимой функции типа key_compare . Этот сохраненный объект — это функция сравнения, доступ к которому может осуществляться путем вызова функции-члена key_comp . Как правило, элементы должны быть просто меньше, чем сопоставимы для установления этого порядка, чтобы, учитывая два элемента, можно определить, что они эквивалентны (в том смысле, что ни меньше другого), либо что один меньше другого. Это приводит к упорядочению неравнозначных элементов. С более технической точки зрения, функция сравнения является бинарным предикатом, который вызывает строгого слабое упорядочение в стандартном математически смысле. Двоичный предикат f(x,y) — это объект функции, имеющий два объекта аргумента x и y , а также возвращаемое значение true или false . Порядок, наложенный на набор, является строгим слабым упорядочением, если двоичный предикат является irreflexive, антисимметричным и транзитивным, и если эквивалентность является транзитивной, где два объекта x и y определены как эквивалентные, если оба f x,y ) и f(y,x) являются ложными. Если более строгое условие равенства между ключами заменяет условие эквивалентности, порядок становится общим (т.е. все элементы упорядочиваются относительно друг друга), и сопоставленные ключи будут неотличимы друг от друга.
В C++14 можно включить разнородный поиск, указав std::less<> или std::greater<> предикат, не имеющий параметров типа. Дополнительные сведения см . в разделе «Разнородный поиск» в ассоциативных контейнерах .
Итератор, предоставляемый классом set, является двунаправленным итератором, но функции-члены insert класса и set имеют версии, которые принимают в качестве параметров шаблона более слабый итератор входных данных, требования к функциональным возможностям которых являются более минимальными, чем те, которые гарантированы классом двунаправленных итераторов. Различные концепции итераторов образуют семейство, связанное уточнениями функциональности. Каждая концепция итератора имеет собственный набор требований, а алгоритмы, работающие с ними, должны ограничивать свои предположения согласно требованиям, предоставляемым этим типом итератора. Можно предположить, что итератор ввода может быть разыменован для обращения к определенному объекту и инкрементирован до следующего итератора в последовательности. Это минимальный набор функциональных возможностей, но достаточно иметь возможность говорить о диапазоне итераторов [ First , ) Last в контексте функций-членов класса.
Конструкторы
| Имя | Описание |
|---|---|
| set | Создает набор, который является пустым или копией части или целого другого набора. |
Определения типов
| Имя | Описание |
|---|---|
| allocator_type | Тип, представляющий класс allocator для объекта набора. |
| const_iterator | Тип, предоставляющий двунаправленный итератор, который может считывать тот или иной элемент const в наборе. |
| const_pointer | Тип, предоставляющий указатель на элемент const в наборе. |
| const_reference | Тип, предоставляющий ссылку на const элемент, хранящийся в наборе для чтения и выполнения const операций. |
| const_reverse_iterator | Тип, предоставляющий двунаправленный итератор, который может считывать любой элемент const в наборе. |
| difference_type | Тип целого числа со знаком, пригодный для использования в качестве представления количества элементов в наборе в диапазоне между элементами, на которые указывают итераторы. |
| iterator | Тип, предоставляющий двунаправленный итератор, который может считывать или изменять любой элемент в наборе. |
| key_compare | Тип, предоставляющий объект функции, который может сравнить два ключа сортировки для определения относительного порядка двух элементов в наборе. |
| key_type | Тип, описывающий объект, сохраненный как элемент набора в смысле его возможностей, присущих ключу сортировки. |
| pointer | Тип, предоставляющий указатель на элемент в наборе. |
| reference | Тип, предоставляющий ссылку на элемент, хранящийся в наборе. |
| reverse_iterator | Тип, предоставляющий двунаправленный итератор, который может считывать или изменять элемент в обращенном наборе. |
| size_type | Тип целого числа без знака, который может представлять число элементов в наборе. |
| value_compare | Тип, предоставляющий объект функции, который может сравнить два элемента, чтобы определить их относительный порядок в наборе. |
| value_type | Тип, описывающий объект, сохраненный как элемент набора в смысле его возможностей, присущих значению. |
Функции
| Имя | Описание |
|---|---|
| begin | Возвращает итератор, обращающийся к первому элементу в set . |
| cbegin | Возвращает итератор const, обращающийся к первому элементу в set . |
| cend | Возвращает итератор const, который обращается к месту, следующему за последним элементом в set . |
| clear | Стирает все элементы в set . |
| contains C++20 | Проверьте, есть ли элемент с указанным ключом в элементе set . |
| count | Возвращает число элементов в контейнере set , ключи которых соответствуют ключу, заданному параметром. |
| crbegin | Возвращает итератор const, который обращается к первому элементу в обращенном контейнере set . |
| crend | Возвращает итератор const, который обращается к месту, следующему за последним элементом в обращенном контейнере set . |
| emplace | Вставляет созданный на месте элемент в set . |
| emplace_hint | Вставляет созданный на месте элемент в set с подсказкой о размещении. |
| empty | Проверяет, пуст ли set . |
| end | Возвращает итератор, который обращается к месту, следующему за последним элементом в контейнере set . |
| equal_range | Возвращает пару итераторов соответственно на первый элемент в set с ключом, который больше, чем указанный ключ, и на первый элемент в set с ключом, который больше или равен данному ключу. |
| erase | Удаляет элемент или диапазон элементов в наборе с заданных позиций или удаляет элементы, соответствующие заданному ключу. |
| find | Возвращает итератор, адресующий расположение элемента в наборе set с ключом, эквивалентным указанному ключу. |
| get_allocator | Возвращает копию объекта allocator , который используется для создания контейнера set . |
| insert | Вставляет элемент или диапазон элементов в set . |
| key_comp | Извлекает копию объекта сравнения, который используется для упорядочивания ключей в контейнере set . |
| lower_bound | Возвращает итератор, указывающий на первый элемент в наборе с ключом, который больше или равен указанному ключу. |
| max_size | Возвращает максимальную длину set . |
| rbegin | Возвращает итератор, который обращается к первому элементу в обращенном контейнере set . |
| rend | Возвращает итератор, который обращается к месту, следующему за последним элементом в обращенном контейнере set . |
| size | Возвращает количество элементов в контейнере set . |
| swap | Выполняет обмен элементами между двумя объектами set . |
| upper_bound | Возвращает итератор, указывающий на первый элемент в set с ключом, который больше указанного ключа. |
| value_comp | Извлекает копию объекта сравнения, который используется для упорядочивания значений элементов в наборе set . |
Операторы
| Имя | Описание |
|---|---|
| operator= | Заменяет элементы набора копией другого набора. |
allocator_type
Тип, представляющий класс распределителя для объекта-набора.
typedef Allocator allocator_type;
Замечания
allocator_type является синонимом для параметра-шаблона Allocator .
Возвращает объект-функцию, которую мультинабор использует для упорядочивания своих элементов, который является параметром-шаблоном Allocator .
Дополнительные сведения см. в разделе «Примечания Allocator » раздела set «Класс «.
Пример
Пример использования см. в примере get_allocator allocator_type .
begin
Возвращает итератор, обращающийся к первому элементу в наборе.
const_iterator begin() const; iterator begin();
Возвращаемое значение
Двунаправленный итератор, адресующий первый элемент в наборе или положение после пустого набора.
Замечания
Если возвращаемое значение begin присваивается объекту const_iterator , элементы в объекте set нельзя изменить. Если возвращаемое значение begin назначено iterator объекту, элементы в объекте set можно изменить.
Пример
// set_begin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set ::iterator s1_Iter; set ::const_iterator s1_cIter; s1.insert( 1 ); s1.insert( 2 ); s1.insert( 3 ); s1_Iter = s1.begin( ); coutThe first element of s1 is 1 The first element of s1 is now 2cbegin
Возвращает итератор const , направленный на первый элемент в диапазоне.
const_iterator cbegin() const;Возвращаемое значение
Итератор двунаправленного доступа const , который указывает на первый элемент диапазона или расположение прямо за концом пустого диапазона ( cbegin() == cend() для пустого диапазона).
Замечания
При возвращаемом значении cbegin элементы в диапазоне не могут быть изменены.
Эту функцию-член можно использовать вместо функции-члена begin() , чтобы гарантировать, что возвращаемое значение будет const_iterator . Как правило, он используется в сочетании с ключевое слово вычета auto типов, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не- const ) контейнер любого вида, который поддерживает begin() и cbegin() .
auto i1 = Container.begin(); // i1 is Container::iterator auto i2 = Container.cbegin(); // i2 is Container::const_iteratorcend
Возвращает итератор const , который обращается к месту, следующему сразу за последним элементом в диапазоне.
const_iterator cend() const;Возвращаемое значение
Итератор двунаправленного доступа const , который указывает на позицию сразу за концом диапазона.
Замечания
cend используется для проверки того, прошел ли итератор конец диапазона.
Эту функцию-член можно использовать вместо функции-члена end() , чтобы гарантировать, что возвращаемое значение будет const_iterator . Как правило, он используется в сочетании с ключевое слово вычета auto типов, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не- const ) контейнер любого вида, который поддерживает end() и cend() .
auto i1 = Container.end(); // i1 is Container::iterator auto i2 = Container.cend(); // i2 is Container::const_iteratorВозвращаемое cend значение не должно быть разоменовывано.
clear
Стирает все элементы в наборе.
void clear();Пример
// set_clear.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; s1.insert( 1 ); s1.insert( 2 ); coutThe size of the set is initially 2. The size of the set after clearing is 0.const_iterator
Тип, предоставляющий двунаправленный итератор, который может считывать тот или иной элемент const в наборе.
typedef implementation-defined const_iterator;Замечания
Тип const_iterator нельзя использовать для изменения значения элемента.
Пример
Пример использования см. в примере begin const_iterator .
const_pointer
Тип, предоставляющий указатель на элемент const в наборе.
typedef typename allocator_type::const_pointer const_pointer;Замечания
Тип const_pointer нельзя использовать для изменения значения элемента.
В большинстве случаев const_iterator следует использовать для доступа к элементам в объекте const set.
const_reference
Тип, предоставляющий ссылку на const элемент, хранящийся в наборе для чтения и выполнения const операций.
typedef typename allocator_type::const_reference const_reference;Пример
// set_const_ref.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; s1.insert( 10 ); s1.insert( 20 ); // Declare and initialize a const_reference &Ref1 // to the 1st element const int &Ref1 = *s1.begin( ); coutThe first element in the set is 10.const_reverse_iterator
Тип, предоставляющий двунаправленный итератор, который может считывать любой элемент const в наборе.
typedef std::reverse_iterator const_reverse_iterator;Замечания
Тип const_reverse_iterator не может изменить значение элемента и используется для итерации по набору в обратном направлении.
Пример
Пример объявления и использования const_reverse_iterator см. в примере rend .
contains
Проверьте, есть ли элемент с указанным ключом в элементе set .
bool contains(const Key& key) const; template bool contains(const K& key) const;Параметры
key
Значение ключа элемента для поиска.Возвращаемое значение
true Значение , если элемент найден в ; set false в противном случае.
Замечания
contains() новый в C++20. Чтобы использовать его, укажите или более поздний /std:c++20 параметр компилятора.
template bool contains(const K& key) const только принимает участие в разрешении перегрузки, если key_compare это прозрачно. Дополнительные сведения см . в разнородном поиске в ассоциативных контейнерах .
Пример
// Requires /std:c++20 or /std:c++latest #include #include int main() < std::settheSet = ; std::couttrue falsecount
Возвращает число элементов в наборе, ключи которых соответствуют ключу, заданному параметром.
size_type count(const Key& key) const;Параметры
key
Ключ для сравнения с ключами элементов набора.Возвращаемое значение
1, если набор содержит элемент, ключ сортировки которого совпадает с ключом параметра. Значение 0, если набор не содержит элемент с соответствующим ключом.
Замечания
Функция-член возвращает число элементов в следующем диапазоне:
[ lower_bound( key ), upper_bound( key ).
Пример
В следующем примере показано использование set::count функции-члена.
// set_count.cpp // compile with: /EHsc #include #include int main() < using namespace std; sets1; set::size_type i; s1.insert(1); s1.insert(1); // Keys must be unique in set, so duplicates are ignored i = s1.count(1); coutThe number of elements in s1 with a sort key of 1 is: 1. The number of elements in s1 with a sort key of 2 is: 0.crbegin
Возвращает итератор const, который обращается к первому элементу в обращенном наборе.
const_reverse_iterator crbegin() const;Возвращаемое значение
Константный обратный двунаправленный итератор, адресующий первый элемент в обратном наборе или элемент, который был последним элементом в наборе до изменения его порядка на противоположный.
Замечания
crbegin используется с обратным набором так же, как begin и с набором.
Возвращаемое значение crbegin объекта set нельзя изменить.
Пример
// set_crbegin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set ::const_reverse_iterator s1_crIter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); s1_crIter = s1.crbegin( ); coutThe first element in the reversed set is 30.crend
Возвращает итератор const, который обращается к месту, следующему за последним элементом в обращенном наборе.
const_reverse_iterator crend() const;Возвращаемое значение
Константный обратный двунаправленный итератор, адресующий расположение после последнего элемента в обратном наборе (расположение перед первым элементом в наборе до изменения его порядка на обратный).
Замечания
crend используется с обратным набором так же, как end и с набором.
Возвращаемое значение crend объекта set нельзя изменить. Возвращаемое crend значение не должно быть разоменовывано.
crend используется, чтобы проверить, достиг ли обратный итератор конца набора.
Пример
// set_crend.cpp // compile with: /EHsc #include #include int main() < using namespace std; set s1; set ::const_reverse_iterator s1_crIter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); s1_crIter = s1.crend( ); s1_crIter--; coutdifference_type
Тип целого числа со знаком, пригодный для использования в качестве представления количества элементов в наборе в диапазоне между элементами, на которые указывают итераторы.
typedef typename allocator_type::difference_type difference_type;Замечания
difference_type — тип, возвращаемый при вычитании или приращении через итераторы контейнера. difference_type обычно используется для представления количества элементов в диапазоне [ first, last) между итераторами first и last , включая элемент, на который указывает first , и диапазон элементов до элемента, на который указывает last , но не включая его.
Хотя difference_type он доступен для всех итераторов, удовлетворяющих требованиям входного итератора, который включает класс двунаправленных итераторов, поддерживаемых обратимыми контейнерами, например набором, вычитание между итераторами поддерживается только средствами случайного доступа, предоставляемыми контейнером случайного доступа, например вектором.
Пример
// set_diff_type.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; set s1; set ::iterator s1_Iter, s1_bIter, s1_eIter; s1.insert( 20 ); s1.insert( 10 ); s1.insert( 20 ); // won't insert as set elements are unique s1_bIter = s1.begin( ); s1_eIter = s1.end( ); set ::difference_type df_typ5, df_typ10, df_typ20; df_typ5 = count( s1_bIter, s1_eIter, 5 ); df_typ10 = count( s1_bIter, s1_eIter, 10 ); df_typ20 = count( s1_bIter, s1_eIter, 20 ); // the keys, and hence the elements of a set are unique, // so there's at most one of a given value cout << "The number '5' occurs " << df_typ5 << " times in set s1.\n"; cout << "The number '10' occurs " << df_typ10 << " times in set s1.\n"; cout << "The number '20' occurs " << df_typ20 << " times in set s1.\n"; // count the number of elements in a set set ::difference_type df_count = 0; s1_Iter = s1.begin( ); while ( s1_Iter != s1_eIter) < df_count++; s1_Iter++; >coutThe number '5' occurs 0 times in set s1. The number '10' occurs 1 times in set s1. The number '20' occurs 1 times in set s1. The number of elements in the set s1 is: 2.emplace
Вставляет элемент, созданный на месте (операции копирования или перемещения не выполняются).
template pair emplace( Args&&. args);Параметры
args
Аргументы, передаваемые для создания элемента для вставки в набор, кроме случаев, когда сопоставление уже содержит элемент, значение которого правильным образом упорядочено.Возвращаемое значение
pair Логическое значение компонента которого возвращает значение true, если вставка была выполнена, и значение false, если карта уже содержала элемент, значение которого имело эквивалентное значение в порядке. Компонент итератора пары возвращаемых значений возвращает адрес, где был вставлен новый элемент (если компонент bool имеет значение true) или где уже находился элемент (если компонент bool имеет значение false).
Замечания
Эта функция не делает недействительными никакие итераторы или ссылки.
При создании исключения состояние контейнера не изменяется.
Пример
// set_emplace.cpp // compile with: /EHsc #include #include #include using namespace std; template void print(const S& s) < cout cout int main() < sets1; auto ret = s1.emplace("ten"); if (!ret.second) < cout << "Emplace failed, element with value \"ten\" already exists." << endl << " The existing element is (" << *ret.first << ")" << endl; cout << "set not modified" else < cout cout << endl; ret = s1.emplace("ten"); if (!ret.second)< cout << "Emplace failed, element with value \"ten\" already exists." << endl << " The existing element is (" << *ret.first << ")" else < cout coutemplace_hint
Вставляет созданный элемент на место (операции копирования или перемещения не выполняются) с указанием о размещении.
template iterator emplace_hint( const_iterator where, Args&&. args);Параметры
args
Аргументы, передаваемые для создания элемента, который будет вставлен в набор, кроме ситуации, когда набор уже содержит этот элемент или, в более общем случае, кроме ситуации, когда набор уже содержит элемент, ключ которого правильно упорядочен.where
Место начала поиска правильной точки вставки. (Если эта точка находится непосредственно перед where , вставка может быть выполнена в постоянном времени с поправкой на амортизацию, а не в логарифмическом времени.)Возвращаемое значение
Итератор, указывающий на вновь вставленный элемент.
Если не удалось вставить элемент, так как он уже существует, возвращается итератор на существующий элемент.
Замечания
Эта функция не делает недействительными никакие итераторы или ссылки.
При создании исключения состояние контейнера не изменяется.
Пример
// set_emplace.cpp // compile with: /EHsc #include #include #include using namespace std; template void print(const S& s) < cout cout int main() < sets1; // Emplace some test data s1.emplace("Anna"); s1.emplace("Bob"); s1.emplace("Carmine"); coutempty
Проверяет, пуст ли набор.
bool empty() const;Возвращаемое значение
true Значение false Значение , если набор непустим.
Пример
// set_empty.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1, s2; s1.insert ( 1 ); if ( s1.empty( ) ) coutThe set s1 is not empty. The set s2 is empty.end
Возврат итератора после конца.
const_iterator end() const; iterator end();Возвращаемое значение
Итератор после конца. Если набор пуст, то set::end() == set::begin() .
Замечания
end используется для проверки того, прошел ли итератор конец набора.
Возвращаемое end значение не должно быть разоменовывано.
Пример кода см. в разделе set::find .
equal_range
Возвращает пару итераторов соответственно на первый элемент в наборе с ключом, который не меньше, чем указанный ключ, и на первый элемент в наборе с ключом, который больше данного ключа.
pair equal_range (const Key& key) const; pair equal_range (const Key& key);Параметры
key
Ключ-аргумент, который будет сравниваться с ключом сортировки элемента из набора, в котором выполняется поиск.Возвращаемое значение
Пара итераторов, где первый является lower_bound ключом, а второй — upper_bound ключом.
Для доступа к первому итератору пары pr , возвращаемой функцией-членом, нужно использовать pr . во-первых, и для разыменовки нижнего итератора итератора используйте *( pr . сначала). Для доступа к второму итератору пары pr , возвращаемой функцией-членом, нужно использовать pr . во-вторых, и для разыменовки итератора верхнего границы используйте *( pr . во-вторых).
Пример
// set_equal_range.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; typedef set> IntSet; IntSet s1; set > :: const_iterator s1_RcIter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); pair p1, p2; p1 = s1.equal_range( 20 ); cout = 40 is: "The upper bound of the element with a key of 20 in the set s1 is: 30. The lower bound of the element with a key of 20 in the set s1 is: 20. A direct call of upper_bound( 20 ) gives 30, matching the 2nd element of the pair returned by equal_range( 20 ). The set s1 doesn't have an element with a key less than 40.erase
Удаляет элемент или диапазон элементов в наборе с заданных позиций или удаляет элементы, соответствующие заданному ключу.
iterator erase( const_iterator Where); iterator erase( const_iterator First, const_iterator Last); size_type erase( const key_type& Key);Параметры
Where
Положение удаляемого элемента.First
Положение первого удаляемого элемента.Last
Позиция после последнего элемента для удаления.Key
Значение ключа удаляемых элементов.Возвращаемое значение
Для первых двух функций-членов это двунаправленный итератор, обозначающий первый элемент, остающийся после любых удаленных элементов, или элемент в конце набора, если таких элементов нет.
Третья функция-член возвращает количество элементов, которые были удалены из набора.
Пример
// set_erase.cpp // compile with: /EHsc #include #include #include #include // next() and prev() helper functions using namespace std; using myset = set; void printset(const myset& s) < for (const auto& iter : s) < cout cout int main() < myset s1; // Fill in some data to test with, one at a time s1.insert("Bob"); s1.insert("Robert"); s1.insert("Bert"); s1.insert("Rob"); s1.insert("Bobby"); cout ; coutfind
Возвращает итератор, ссылающийся на элемент в наборе, ключ которого эквивалентен заданному ключу.
iterator find(const Key& key); const_iterator find(const Key& key) const;Параметры
key
Значение ключа, с которым сравнивается ключ сортировки элемента из набора, по которому выполняется поиск.Возвращаемое значение
Итератор, ссылающийся на расположение элемента с указанным ключом или на расположение элемента после последнего элемента в наборе ( set::end() ), если для ключа не найдено совпадений.
Замечания
Функция-член возвращает итератор, ссылающийся на элемент в наборе, ключ которого эквивалентен ключу аргумента в двоичном предикате, который вызывает упорядочение на основе меньшего отношения сравнения.
Если возвращаемое значение find назначено объекту const_iterator , объект set не может быть изменен. Если возвращаемое значение find назначено объекту iterator , можно изменить объект set.
Пример
// compile with: /EHsc /W4 /MTd #include #include #include #include using namespace std; template void print_elem(const T& t) < cout template void print_collection(const T& t) < cout cout template void findit(const C& c, T val) < cout << "Trying find() on value " << val << endl; auto result = c.find(val); if (result != c.end()) < cout << "Element found: "; print_elem(*result); cout else < cout << "Element not found." > int main() < sets1(< 40, 45 >); cout << "The starting set s1 is: " << endl; print_collection(s1); vectorv; v.push_back(43); v.push_back(41); v.push_back(46); v.push_back(42); v.push_back(44); v.push_back(44); // attempt a duplicate coutget_allocator
Возвращает копию объекта-распределителя, использованного для создания набора.
allocator_type get_allocator() const;Возвращаемое значение
Распределитель, использующийся набор для управления памятью, который является параметром-шаблоном Allocator .
Дополнительные сведения см. в разделе "Примечания Allocator " раздела set "Класс ".
Замечания
Распределители для класса набора определяют, как этот класс управляет хранилищем. Для большинства задач программирования достаточно иметь распределители по умолчанию, поставляемые вместе с классами контейнеров стандартной библиотеки C++. Написание и использование собственного класса распределителя требует расширенных навыков работы с C++.
Пример
// set_get_allocator.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set ::allocator_type s1_Alloc; set ::allocator_type s2_Alloc; set ::allocator_type s3_Alloc; set ::allocator_type s4_Alloc; // The following lines declare objects // that use the default allocator. set s1; sets2; set s3; s1_Alloc = s1.get_allocator( ); s2_Alloc = s2.get_allocator( ); s3_Alloc = s3.get_allocator( ); cout << "The number of integers that can be allocated" << endl << "before free memory is exhausted: " << s2.max_size( ) << "." << endl; cout << "\nThe number of doubles that can be allocated" << endl << "before free memory is exhausted: " << s3.max_size( ) << "." << endl; // The following line creates a set s4 // with the allocator of multiset s1. set s4( less( ), s1_Alloc ); s4_Alloc = s4.get_allocator( ); // Two allocators are interchangeable if // storage allocated from each can be // deallocated by the other if( s1_Alloc == s4_Alloc ) < cout else < cout > Вставить
Вставляет элемент или диапазон элементов в набор.
// (1) single element pair insert( const value_type& Val); // (2) single element, perfect forwarded template pair insert( ValTy&& Val); // (3) single element with hint iterator insert( const_iterator Where, const value_type& Val); // (4) single element, perfect forwarded, with hint template iterator insert( const_iterator Where, ValTy&& Val); // (5) range template void insert( InputIterator First, InputIterator Last); // (6) initializer list void insert( initializer_list IList);Параметры
Val
Значение элемента, вставляемого в набор, если оно уже не содержит элемент, значение которого эквивалентно упорядочено.Where
Место начала поиска правильной точки вставки. (Если эта точка немедленно предшествует Где вставка может происходить в амортизированном времени константы вместо логарифмического времени.)ValTy
Параметр шаблона, указывающий тип аргумента, который набор может использовать для создания элемента value_type и идеального перенаправления Val в качестве аргумента.First
Позиция первого элемента, который следует скопировать.Last
Позиция непосредственно перед последним элементом, который следует скопировать.InputIterator
Аргумент функции шаблона, соответствующий требованиям входного итератора , который указывает на элементы типа, который можно использовать для создания value_type объектов.IList
Объект initializer_list , из которого нужно скопировать элементы.Возвращаемое значение
Функции-члены с одним элементом (1) и (2) возвращают pair компонент, компонент которого bool имеет значение true, если вставка была выполнена, и значение false, если набор уже содержал элемент эквивалентного значения в порядке. Компонент итератора пары возвращаемых значений указывает на вставленный элемент, если значение компонента bool равно true, или на существующий элемент, если значение компонента bool равно false.
Одноэлеметные функции-члены с подсказкой (3) и (4) возвращают итератор, который указывает на позицию, где новый элемент был вставлен, или, если элемент с эквивалентным ключом уже существует, указывает на существующий элемент.
Замечания
Эта функция не делает никакие итераторы, указатели или ссылки недействительными.
Во время вставки только одного элемента, если создается исключение, состояние контейнера не изменяется. Если во время вставки нескольких элементов вызывается исключение, контейнер остается в неопределенном, но допустимом состоянии.
Для доступа к компоненту итератора pair pr , возвращаемого одноэлементными функциями-членами, используйте pr.first . Для разыменования итератора в возвращенной паре используйте *pr.first , чтобы получить элемент. Для доступа к компоненту bool используйте pr.second . См. пример кода далее в этой статье.
Контейнер value_type является типом, который принадлежит контейнеру, а для набора set::value_type — тип const V .
Функция-член диапазона (5) вставляет последовательность значений элементов в набор, соответствующий каждому элементу, адресуемого итератором в диапазоне [First, Last) , Last поэтому не вставляется. Контейнер функции-члена end() ссылается на позицию сразу после последнего элемента в контейнере. Например, оператор s.insert(v.begin(), v.end()); пытается вставить все элементы v в s . Вставляются только элементы с уникальными значениями в диапазоне. Повторяющиеся значения игнорируются. Чтобы увидеть, какие элементы отклонены, используйте одноэлементные версии insert .
Функция-член списка инициализатора (6) использует initializer_list для копирования элементов в набор.
Для вставки элемента, созданного на месте, то есть операции копирования или перемещения не выполняются, см set::emplace . и set::emplace_hint .
Пример
// set_insert.cpp // compile with: /EHsc #include #include #include #include using namespace std; template void print(const S& s) < cout cout int main() < // insert single values sets1; // call insert(const value_type&) version s1.insert(< 1, 10 >); // call insert(ValTy&&) version s1.insert(20); cout << "The original set values of s1 are:" << endl; print(s1); // intentionally attempt a duplicate, single element auto ret = s1.insert(1); if (!ret.second)< auto elem = *ret.first; cout << "Insert failed, element with value 1 already exists." << endl << " The existing element is (" << elem << ")" else < cout cout << endl; // single element, with hint s1.insert(s1.end(), 30); cout << "The modified set values of s1 are:" << endl; print(s1); cout << endl; // The templatized version inserting a jumbled range sets2; vector v; v.push_back(43); v.push_back(294); v.push_back(41); v.push_back(330); v.push_back(42); v.push_back(45); cout << "Inserting the following vector data into s2:" << endl; print(v); s2.insert(v.begin(), v.end()); cout << "The modified set values of s2 are:" << endl; print(s2); cout << endl; // The templatized versions move-constructing elements sets3; string str1("blue"), str2("green"); // single element s3.insert(move(str1)); cout << "After the first move insertion, s3 contains:" << endl; print(s3); // single element with hint s3.insert(s3.end(), move(str2)); cout << "After the second move insertion, s3 contains:" << endl; print(s3); cout << endl; sets4; // Insert the elements from an initializer_list s4.insert(< 4, 44, 2, 22, 3, 33, 1, 11, 5, 55 >); coutiterator
Тип, предоставляющий константный двунаправленный итератор, который может читать любой элемент в наборе.
typedef implementation-defined iterator;Пример
Пример объявления и использования iterator см. в примере begin .
key_comp
Извлекает копию объекта сравнения, который используется для упорядочивания ключей в наборе.
key_compare key_comp() const;Возвращаемое значение
Возвращает объект-функцию, которую набор использует для упорядочивания своих элементов, что является параметром-шаблоном Traits .
Дополнительные сведения см Traits . в set разделе "Класс ".
Замечания
Сохраненный объект определяет функцию-член:
bool operator()(const Key, const Key& _xVal _yVal &);
значение , которое возвращается true , если _xVal предшествует и не равно _yVal в порядке сортировки.
Оба key_compare и value_compare являются синонимами для параметра Traits шаблона. Оба типа предоставляются для классов набора и нескольких наборов, где они идентичны, для совместимости с классами карт и несколькими картами, где они отличаются.
Пример
// set_key_comp.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set > s1; set >::key_compare kc1 = s1.key_comp( ) ; bool result1 = kc1( 2, 3 ) ; if( result1 == true ) < cout else < cout set > s2; set >::key_compare kc2 = s2.key_comp( ) ; bool result2 = kc2( 2, 3 ) ; if(result2 == true) < cout else < cout >kc1( 2,3 ) returns value of true, where kc1 is the function object of s1. kc2( 2,3 ) returns value of false, where kc2 is the function object of s2.key_compare
Тип, предоставляющий объект функции, который может сравнить два ключа сортировки для определения относительного порядка двух элементов в наборе.
typedef Traits key_compare;Замечания
key_compare является синонимом для параметра-шаблона Traits .
Дополнительные сведения см Traits . в set разделе "Класс ".
Оба key_compare и value_compare являются синонимами для параметра Traits шаблона. Оба типа предоставляются для классов набора и нескольких наборов, где они идентичны, для совместимости с классами карт и несколькими картами, где они отличаются.
Пример
Пример объявления и использования key_compare см. в примере key_comp .
key_type
Тип, описывающий объект, сохраненный как элемент набора в смысле его возможностей, присущих ключу сортировки.
typedef Key key_type;Замечания
key_type является синонимом для параметра-шаблона Key .
Дополнительные сведения см. в разделе "Примечания Key " раздела set "Класс ".
Оба key_type и value_type являются синонимами для параметра Key шаблона. Оба типа предоставляются для классов набора и нескольких наборов, где они идентичны, для совместимости с классами карт и несколькими картами, где они отличаются.
Пример
Пример объявления и использования key_type см. в примере value_type .
lower_bound
Возвращает итератор, указывающий на первый элемент в наборе с ключом, который больше или равен указанному ключу.
const_iterator lower_bound(const Key& key) const; iterator lower_bound(const Key& key);Параметры
key
Ключ-аргумент, который будет сравниваться с ключом сортировки элемента из набора, в котором выполняется поиск.Возвращаемое значение
Итератор или const_iterator , который адресует положение элемента в наборе с ключом, который равен ключу-аргументу или больше него, либо адресует положение после последнего элемента в наборе, если соответствие для ключа не найдено.
Пример
// set_lower_bound.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set :: const_iterator s1_AcIter, s1_RcIter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); s1_RcIter = s1.lower_bound( 20 ); coutThe element of set s1 with a key of 20 is: 20. The set s1 doesn't have an element with a key of 40. The element of s1 with a key matching that of the last element is: 30.max_size
Возвращает максимальную длину набора.
size_type max_size() const;Возвращаемое значение
Максимально возможная длина набора.
Пример
// set_max_size.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set ::size_type i; i = s1.max_size( ); coutoperator=
Заменяет элементы этого set элементами из другого set .
set& operator=(const set& right); set& operator=(set&& right);Параметры
right
set , предоставляющий новые элементы для назначения set .Замечания
Первая версия operator= использует ссылку lvalue для right , чтобы копировать элементы из right в set .
Вторая версия использует ссылку rvalue для right. Она перемещает элементы из right в set .
Все элементы в этом set до выполнения функции оператора отбрасываются.
Пример
// set_operator_as.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; setv1, v2, v3; set::iterator iter; v1.insert(10); coutpointer
Тип, предоставляющий указатель на элемент в наборе.
typedef typename allocator_type::pointer pointer;Замечания
Тип pointer можно использовать для изменения значения элемента.
В большинстве случаев iterator необходимо использовать для доступа к элементам в объекте set.
rbegin
Возвращает итератор, который обращается к первому элементу в обращенном наборе.
const_reverse_iterator rbegin() const; reverse_iterator rbegin();Возвращаемое значение
Обратный двунаправленный итератор, адресующий первый элемент в обратном наборе или элемент, который был последним элементом в наборе до изменения его порядка на противоположный.
Замечания
rbegin используется с обратным набором так же, как begin и с набором.
Если возвращаемое значение rbegin назначено объекту const_reverse_iterator , объект set не может быть изменен. Если возвращенное значение rbegin назначается reverse_iterator , то объект-набор можно изменить.
rbegin можно использовать для последовательного прохождения по списку в обратную сторону.
Пример
// set_rbegin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set ::iterator s1_Iter; set ::reverse_iterator s1_rIter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); s1_rIter = s1.rbegin( ); coutThe first element in the reversed set is 30. The set is: 10 20 30 The reversed set is: 30 20 10 After the erasure, the first element in the reversed set is 20.reference
Тип, предоставляющий ссылку на элемент, хранящийся в наборе.
typedef typename allocator_type::reference reference;Пример
// set_reference.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; s1.insert( 10 ); s1.insert( 20 ); // Declare and initialize a reference &Ref1 to the 1st element const int &Ref1 = *s1.begin( ); coutThe first element in the set is 10.rend
Возвращает итератор, который обращается к месту, следующему за последним элементом в обращенном наборе.
const_reverse_iterator rend() const; reverse_iterator rend();Возвращаемое значение
Обратный двунаправленный итератор, адресующий расположение после последнего элемента в обратном наборе (расположение перед первым элементом в наборе до изменения его порядка на обратный).
Замечания
rend используется с обратным набором так же, как end и с набором.
Если возвращаемое значение rend назначено объекту const_reverse_iterator , объект set не может быть изменен. Если возвращенное значение rend назначается reverse_iterator , то объект-набор можно изменить. Возвращаемое rend значение не должно быть разоменовывано.
rend используется, чтобы проверить, достиг ли обратный итератор конца набора.
Пример
// set_rend.cpp // compile with: /EHsc #include #include int main() < using namespace std; set s1; set ::iterator s1_Iter; set ::reverse_iterator s1_rIter; set ::const_reverse_iterator s1_crIter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); s1_rIter = s1.rend( ); s1_rIter--; coutreverse_iterator
Тип, предоставляющий двунаправленный итератор, который может считывать или изменять элемент в обращенном наборе.
typedef std::reverse_iterator reverse_iterator;Замечания
Тип reverse_iterator используется для итерации по набору в обратном направлении.
Пример
Пример объявления и использования reverse_iterator см. в примере rbegin .
set
Создает набор, который является пустым или копией части или целого другого набора.
set(); explicit set( const Traits& Comp); set( const Traits& Comp, const Allocator& Al); set( const set& Right); set( set&& Right); set( initializer_list IList); set( initializer_list IList, const Compare& Comp); set( initializer_list IList, const Compare& Comp, const Allocator& Al); template set( InputIterator First, InputIterator Last); template set( InputIterator First, InputIterator Last, const Traits& Comp); template set( InputIterator First, InputIterator Last, const Traits& Comp, const Allocator& Al);Параметры
Al
Класс распределителя хранилища, используемый для этого объекта набора, который по умолчанию используется Allocator .Comp
Функция сравнения типа const Traits используется для упорядочивания элементов в наборе, который по умолчанию имеет значение Compare .Rght
Набор, для которого создаваемый набор станет копией.First
Положение первого элемента в диапазоне копируемых элементов.Last
Положение первого элемента после диапазона копируемых элементов.IList
Объект initializer_list, из которого копируются элементы.Замечания
Все конструкторы хранят тип объекта распределителя, который управляет хранилищем памяти для набора и может позже возвращаться путем вызова get_allocator . Параметр распределителя часто опускается в объявлениях классов и макросах предварительной обработки, используемых для замены альтернативных распределителей.
Все конструкторы инициализируют свои наборы.
Все конструкторы хранят объект функции типа Traits , который используется для установления порядка между ключами набора и которые позже могут быть возвращены путем вызова key_comp .
Первые три конструктора указывают пустой начальный набор, второй, указывающий тип функции сравнения ( comp ) для установки порядка элементов и третьего явного указания типа распределителя ( al ) для использования. Ключевое слово explicit подавляет определенные виды автоматического преобразования типов.
Четвертый конструктор указывает копию набора right .
Следующие три конструктора используют initializer_list, чтобы указать элементы.
Следующие три конструктора копируют диапазон [ first , last ) набора с увеличением явности при указании типа функции сравнения класса Traits и Allocator .
Восьмой конструктор указывает копию набора путем перемещения right .
Пример
// set_set.cpp // compile with: /EHsc #include #include int main() < using namespace std; // Create an empty set s0 of key type integer set s0; // Create an empty set s1 with the key comparison // function of less than, then insert 4 elements sets1; s1.insert(10); s1.insert(20); s1.insert(30); s1.insert(40); // Create an empty set s2 with the key comparison // function of less than, then insert 2 elements set s2; s2.insert(10); s2.insert(20); // Create a set s3 with the // allocator of set s1 set ::allocator_type s1_Alloc; s1_Alloc = s1.get_allocator(); set s3(less(), s1_Alloc); s3.insert(30); // Create a copy, set s4, of set s1 set s4(s1); // Create a set s5 by copying the range s1[ first, last) set ::const_iterator s1_bcIter, s1_ecIter; s1_bcIter = s1.begin(); s1_ecIter = s1.begin(); s1_ecIter++; s1_ecIter++; set s5(s1_bcIter, s1_ecIter); // Create a set s6 by copying the range s4[ first, last) // and with the allocator of set s2 set ::allocator_type s2_Alloc; s2_Alloc = s2.get_allocator(); set s6(s4.begin(), ++s4.begin(), less(), s2_Alloc); cout << "s1 ="; for (auto i : s1) cout << " " << i; cout << endl; cout << "s2 = " << *s2.begin() << " " << *++s2.begin() << endl; cout << "s3 ="; for (auto i : s3) cout << " " << i; cout << endl; cout << "s4 ="; for (auto i : s4) cout << " " << i; cout << endl; cout << "s5 ="; for (auto i : s5) cout << " " << i; cout << endl; cout << "s6 ="; for (auto i : s6) cout << " " << i; cout << endl; // Create a set by moving s5 sets7(move(s5)); cout << "s7 ="; for (auto i : s7) cout << " " << i; cout << endl; // Create a set with an initializer_list cout << "s8 ="; sets8 < < 1, 2, 3, 4 >>; for (auto i : s8) cout << " " << i; cout << endl; cout << "s9 ="; sets9< < 5, 6, 7, 8 >, less() >; for (auto i : s9) cout << " " << i; cout << endl; cout << "s10 ="; sets10< < 10, 20, 30, 40 >, less(), s9.get_allocator() >; for (auto i : s10) cout s1 = 10 20 30 40s2 = 10 20s3 = 30s4 = 10 20 30 40s5 = 10 20s6 = 10s7 = 10 20s8 = 1 2 3 4s9 = 5 6 7 8s10 = 10 20 30 40size
Возвращает количество элементов в наборе.
size_type size() const;Возвращаемое значение
Текущая длина набора.
Пример
// set_size.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set :: size_type i; s1.insert( 1 ); i = s1.size( ); coutThe set length is 1. The set length is now 2.size_type
Тип целого числа без знака, который может представлять число элементов в наборе.
typedef typename allocator_type::size_type size_type;Пример
Пример объявления и использования см. в примере size size_type
swap
Обмен элементами между двумя наборами.
void swap( set& right);Параметры
right
Набор-аргумент предоставляет элементы для обмена с целевым набором.Замечания
Функция-член не делает недействительными никакие ссылки, указатели или итераторы, обозначающие элементы в двух наборах, между которыми выполняется обмен элементами.
Пример
// set_swap.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1, s2, s3; set ::iterator s1_Iter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); s2.insert( 100 ); s2.insert( 200 ); s3.insert( 300 ); coutThe original set s1 is: 10 20 30. After swapping with s2, list s1 is: 100 200. After swapping with s3, list s1 is: 300.upper_bound
Возвращает итератор, указывающий на первый элемент в наборе с ключом, который больше указанного ключа.
const_iterator upper_bound(const Key& key) const; iterator upper_bound(const Key& key);Параметры
key
Ключ-аргумент, который будет сравниваться с ключом сортировки элемента из набора, в котором выполняется поиск.Возвращаемое значение
const_iterator Или iterator адресирует расположение элемента в наборе, которое с ключом больше ключа аргумента или адресирует расположение, успешное выполнение последнего элемента в наборе, если совпадение не найдено для ключа.
Пример
// set_upper_bound.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set :: const_iterator s1_AcIter, s1_RcIter; s1.insert( 10 ); s1.insert( 20 ); s1.insert( 30 ); s1_RcIter = s1.upper_bound( 20 ); cout 40 is: "The first element of set s1 with a key greater than 20 is: 30. The set s1 doesn't have an element with a key greater than 30. The first element of s1 with a key greater than that of the initial element of s1 is: 20.value_comp
Извлекает копию объекта сравнения, который используется для упорядочивания значений элементов в наборе.
value_compare value_comp() const;Возвращаемое значение
Возвращает объект-функцию, которую набор использует для упорядочивания своих элементов, что является параметром-шаблоном Traits .
Дополнительные сведения см Traits . в set разделе "Класс ".
Замечания
Сохраненный объект определяет функцию-член:
оператор bool (const Key, const Key& _xVal _yVal &);
значение , которое возвращается true , если _xVal предшествует и не равно _yVal в порядке сортировки.
Оба value_compare и key_compare являются синонимами для параметра Traits шаблона. Оба типа предоставляются для классов набора и нескольких наборов, где они идентичны, для совместимости с классами карт и несколькими картами, где они отличаются.
Пример
// set_value_comp.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set > s1; set >::value_compare vc1 = s1.value_comp( ); bool result1 = vc1( 2, 3 ); if( result1 == true ) < cout else < cout set > s2; set >::value_compare vc2 = s2.value_comp( ); bool result2 = vc2( 2, 3 ); if( result2 == true ) < cout else < cout >vc1( 2,3 ) returns value of true, where vc1 is the function object of s1. vc2( 2,3 ) returns value of false, where vc2 is the function object of s2.value_compare
Тип, предоставляющий объект функции, который может сравнить значениях двух элементов, чтобы определить их относительный порядок в наборе.
typedef key_compare value_compare;Замечания
value_compare является синонимом для параметра-шаблона Traits .
Дополнительные сведения см Traits . в set разделе "Класс ".
Оба key_compare и value_compare являются синонимами для параметра Traits шаблона. Оба типа предоставляются для классов набора и нескольких наборов, где они идентичны, для совместимости с классами карт и несколькими картами, где они отличаются.
Пример
Пример объявления и использования value_compare см. в примере value_comp .
value_type
Тип, описывающий объект, который сохранен как элемент набора в смысле его возможностей, присущих значению.
typedef Key value_type;Замечания
value_type является синонимом для параметра-шаблона Key .
Дополнительные сведения см. в разделе "Примечания Key " раздела set "Класс ".
Оба key_type и value_type являются синонимами для параметра Key шаблона. Оба типа предоставляются для классов набора и нескольких наборов, где они идентичны, для совместимости с классами карт и несколькими картами, где они отличаются.
Пример
// set_value_type.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; set s1; set ::iterator s1_Iter; set ::value_type svt_Int; // Declare value_type svt_Int = 10; // Initialize value_type set :: key_type skt_Int; // Declare key_type skt_Int = 20; // Initialize key_type s1.insert( svt_Int ); // Insert value into s1 s1.insert( skt_Int ); // Insert key into s1 // A set accepts key_types or value_types as elements coutThe set has elements: 10 20.