Класс multiset

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

Синтаксис

template <class Key, class Compare =less <Key>, class Allocator =allocator <Key>>
class multiset

Параметры

Key
Тип данных элемента для сохранения в multiset.

Compare
Тип, предоставляющий объект функции, который может сравнить два значения элементов в виде ключей сортировки, чтобы определить их относительный порядок в .multiset Двоичное предикат меньше<ключа> является значением по умолчанию.

В C++14 можно включить разнородный поиск, указав std::less<> или std::greater<> предикат, не имеющий параметров типа. Дополнительные сведения см . в разделе "Разнородный поиск" в ассоциативных контейнерах .

Allocator
Тип, представляющий хранимый объект распределителя, инкапсулирующий сведения о multisetвыделении и освобождении памяти. Значение по умолчанию — allocator<Key>.

Замечания

Класс стандартной библиотеки multiset C++ :

  • Ассоциативный контейнер, который является контейнером переменного размера, поддерживающим эффективное получение значений элементов на основе значения соответствующего ключа.

  • Реверсивный, поскольку он предоставляет двунаправленные итераторы для получения доступа к его элементам.

  • Сортированный, поскольку его элементы упорядочены по значениям ключей в контейнере в соответствии с заданной функцией сравнения.

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

  • Простой ассоциативный контейнер, поскольку его значения элементов являются значениями его ключей.

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

Итератор, предоставляемый multiset классом, является двунаправленным итератором, но функции-члены insert класса и multiset имеют версии, которые принимают в качестве параметров шаблона более слабый итератор входных данных, требования к функциональным возможностям которых являются более минимальными, чем те, которые гарантированы классом двунаправленных итераторов. Различные концепции итераторов образуют семейство, связанное уточнениями функциональности. Каждая концепция итератора имеет собственный набор требований, а алгоритмы, работающие с ними, должны ограничивать свои предположения согласно требованиям, предоставляемым этим типом итератора. Можно предположить, что итератор ввода может быть разыменован для обращения к определенному объекту и инкрементирован до следующего итератора в последовательности. Это минимальный набор функциональных возможностей, но его достаточно, чтобы иметь возможность осмысленно говорить о диапазоне итераторов [ First, Last) в контексте функций-членов класса.

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

Должен multiset быть ассоциативный контейнер выбора, когда условия, связывающие значения со своими ключами, удовлетворяются приложением. Элементы могут multiset быть несколькими и служить собственными ключами сортировки, поэтому ключи не являются уникальными. Модель для этого типа структуры — упорядоченный список, например, ключевых слов, в котором слова могут встречаться несколько раз. Если бы множественных вхождения слов не допускались, набор был бы соответствующей структурой контейнера. Если бы уникальные определения вносились в список уникальных ключевых слов в качестве значений, сопоставление было бы подходящей структурой для размещения этих данных. Если вместо этого определения не были уникальными, то multimap будет контейнер выбора.

Порядок multiset последовательности, которую он управляет, путем вызова объекта хранимой функции типа 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<> предикат, не имеющий параметров типа. Дополнительные сведения см . в разделе "Разнородный поиск" в ассоциативных контейнерах .

Конструкторы

Конструктор Description
multiset Создает multiset, который является пустым или копией части или целого заданного multiset.

Определения типов

Введите имя Description
allocator_type Typedef для класса allocator для объекта multiset.
const_iterator Typedef для двунаправленного итератора, который может считывать элемент const в multiset.
const_pointer Typedef для указателя на элемент const в multiset.
const_reference Типдф для ссылки на const элемент, хранящийся в элементе multiset для чтения и выполнения const операций.
const_reverse_iterator Typedef для двунаправленного итератора, который может считывать любой элемент const в multiset.
difference_type Целочисленный Typedef со знаком для числа элементов в multiset в диапазоне между элементами, на которые указывают итераторы.
iterator Typedef для двунаправленного итератора, который может считывать или изменять любой элемент в multiset.
key_compare Typedef для объекта функции, который может сравнивать два ключа для определения относительного порядка двух элементов в multiset.
key_type Typedef для объекта функции, который может сравнить два ключа сортировки для определения относительного порядка двух элементов в multiset.
pointer Typedef для указателя на элемент в multiset.
reference Typedef для ссылки на элемент, сохраненный в multiset.
reverse_iterator Typedef для двунаправленного итератора, который может считывать или изменять элемент в обратном multiset.
size_type Целочисленный Typedef без знака, который может представлять число элементов в multiset.
value_compare Typedef для объекта функции, который может сравнить два элемента как ключи сортировки для определения их относительного порядка в multiset.
value_type Typedef, описывающий объект, хранящийся в виде элемента, как multiset в смысле его возможностей, присущих значению.

Функции элементов

Функция-член Description
begin Возвращает итератор, указывающий на первый элемент в multiset.
cbegin Возвращает итератор const, обращающийся к первому элементу в multiset.
cend Возвращает итератор const, который обращается к месту, следующему за последним элементом в multiset.
clear Стирает все элементы в multiset.
containsC++20 Проверьте, есть ли элемент с указанным ключом в элементе multiset.
count Возвращает число элементов в multiset, ключи которых соответствуют ключу, заданному в виде параметра.
crbegin Возвращает итератор const, который обращается к первому элементу в обращенном контейнере multiset.
crend Возвращает итератор const, который обращается к месту, следующему за последним элементом в обращенном контейнере multiset.
emplace Вставляет созданный на месте элемент в multiset.
emplace_hint Вставляет созданный на месте элемент в multiset с подсказкой о размещении.
empty Проверяет, пуст ли multiset.
end Возвращает итератор, указывающий на место после завершающего элемента в multiset.
equal_range Возвращает пару итераторов. Первый итератор в паре указывает на первый элемент в multiset с ключом, который больше указанного ключа. Второй итератор в паре указывает на первый элемент в multiset с ключом, который больше или равен заданному ключу.
erase Удаляет элемент или диапазон элементов в multiset с заданных позиций или удаляет элементы, соответствующие заданному ключу.
find Возвращает итератор, указывающий на первое расположение элемента в multiset, имеющего ключ, равный указанному ключу.
get_allocator Возвращает копию объекта allocator, который используется для создания multiset.
insert Вставляет элемент или диапазон элементов в multiset.
key_comp Предоставляет объект функции, который может сравнивать два ключа сортировки для определения относительного порядка двух элементов в multiset.
lower_bound Возвращает итератор, указывающий на первый элемент в multiset с ключом, который больше или равен указанному ключу.
max_size Возвращает максимальную длину multiset.
rbegin Возвращает итератор, указывающий на первый элемент в обратном multiset.
rend Возвращает итератор, указывающий на местоположение, расположенное после завершающего элемента в обратном multiset.
size Возвращает количество элементов в multiset.
swap Выполняет обмен элементами между двумя объектами multiset.
upper_bound Возвращает итератор, указывающий на первый элемент в multiset с ключом, который больше указанного ключа.
value_comp Извлекает копию объекта сравнения, который используется для упорядочивания значений элементов в multiset.

Операторы

Operator Description
operator= Заменяет элементы multiset копией другого multiset.

Requirements

Заголовок.<set>

Пространство именstd:

multiset::allocator_type

Тип, представляющий класс распределителя для multiset объекта

typedef Allocator allocator_type;

Замечания

allocator_type является синонимом для параметра-шаблона Allocator.

Более подробную информацию по Allocator см. в разделе "Примечания" в документации к классу multiset.

Пример

Пример использования см. в примере get_allocatorallocator_type

multiset::begin

Возвращает итератор, обращающийся к первый элемент в контейнере multiset.

const_iterator begin() const;

iterator begin();

Возвращаемое значение

Двунаправленный итератор, обращаюющийся к первому элементу в multiset расположении, успешному пустому мультисетю.

Пример

// multiset_begin.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int>::iterator ms1_Iter;
   multiset <int>::const_iterator ms1_cIter;

   ms1.insert( 1 );
   ms1.insert( 2 );
   ms1.insert( 3 );

   ms1_Iter = ms1.begin( );
   cout << "The first element of ms1 is " << *ms1_Iter << endl;

   ms1_Iter = ms1.begin( );
   ms1.erase( ms1_Iter );

   // The following 2 lines would err as the iterator is const
   // ms1_cIter = ms1.begin( );
   // ms1.erase( ms1_cIter );

   ms1_cIter = ms1.begin( );
   cout << "The first element of ms1 is now " << *ms1_cIter << endl;
}
The first element of ms1 is 1
The first element of ms1 is now 2

multiset::cbegin

Возвращает итератор const, направленный на первый элемент в диапазоне.

const_iterator cbegin() const;

Возвращаемое значение

Итератор двунаправленного доступа const, который указывает на первый элемент диапазона или расположение прямо за концом пустого диапазона (cbegin() == cend() для пустого диапазона).

Замечания

При возвращаемом значении cbeginэлементы в диапазоне не могут быть изменены.

Эту функцию-член можно использовать вместо функции-члена begin(), чтобы гарантировать, что возвращаемое значение будет const_iterator. Обычно используется вместе с ключевым словом вывода типа auto, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не-const) контейнер любого вида, который поддерживает begin() и cbegin().

auto i1 = Container.begin();
// i1 is Container<T>::iterator
auto i2 = Container.cbegin();

// i2 is Container<T>::const_iterator

multiset::cend

Возвращает итератор const, который обращается к месту, следующему сразу за последним элементом в диапазоне.

const_iterator cend() const;

Возвращаемое значение

Итератор двунаправленного доступа const, который указывает на позицию сразу за концом диапазона.

Замечания

cend используется для проверки того, прошел ли итератор конец диапазона.

Эту функцию-член можно использовать вместо функции-члена end(), чтобы гарантировать, что возвращаемое значение будет const_iterator. Обычно используется вместе с ключевым словом вывода типа auto, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не-const) контейнер любого вида, который поддерживает end() и cend().

auto i1 = Container.end();
// i1 is Container<T>::iterator
auto i2 = Container.cend();

// i2 is Container<T>::const_iterator

Возвращаемое cend значение не должно быть разоменовывано.

multiset::clear

Стирает все элементы в multiset.

void clear();

Пример

// multiset_clear.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;

   ms1.insert( 1 );
   ms1.insert( 2 );

   cout << "The size of the multiset is initially "
        << ms1.size( ) << "." << endl;

   ms1.clear( );
   cout << "The size of the multiset after clearing is "
        << ms1.size( ) << "." << endl;
}
The size of the multiset is initially 2.
The size of the multiset after clearing is 0.

multiset::const_iterator

Тип, предоставляющий двунаправленный итератор, который может считывать тот или иной элемент const в контейнере multiset.

typedef implementation-defined const_iterator;

Замечания

Тип const_iterator нельзя использовать для изменения значения элемента.

Пример

Пример использования const_iteratorсм. в примереbegin.

multiset::const_pointer

Тип, предоставляющий указатель на элемент const в контейнере multiset.

typedef typename allocator_type::const_pointer const_pointer;

Замечания

Тип const_pointer нельзя использовать для изменения значения элемента.

В большинстве случаев итератор должен использоваться для доступа к элементам в объекте multiset .

multiset::const_reference

Тип, предоставляющий ссылку на const элемент, хранящийся в элементе multiset для чтения и выполнения const операций.

typedef typename allocator_type::const_reference const_reference;

Пример

// multiset_const_ref.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;

   ms1.insert( 10 );
   ms1.insert( 20 );

   // Declare and initialize a const_reference &Ref1
   // to the 1st element
   const int &Ref1 = *ms1.begin( );

   cout << "The first element in the multiset is "
        << Ref1 << "." << endl;

   // The following line would cause an error because the
   // const_reference can't be used to modify the multiset
   // Ref1 = Ref1 + 5;
}
The first element in the multiset is 10.

multiset::const_reverse_iterator

Тип, предоставляющий двунаправленный итератор, который может считывать любой элемент const в контейнере multiset.

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

Замечания

Тип const_reverse_iterator не может изменить значение элемента и используется для итерации с помощью обратного multiset элемента.

Пример

Пример объявления и использования const_reverse_iteratorсм. в примереrend.

multiset::contains

Проверьте, есть ли элемент с указанным ключом в элементе multiset.

bool contains(const Key& key) const;
template<class K> bool contains(const K& key) const;

Параметры

K
Тип ключа.

key
Значение ключа элемента для поиска.

Возвращаемое значение

true Значение , если элемент найден в контейнере; false Иначе.

Замечания

contains() новый в C++20. Чтобы использовать его, укажите параметр компилятора /std:c++20 или более поздней версии.

template<class K> bool contains(const K& key) const только принимает участие в разрешении перегрузки, если key_compare это прозрачно. Дополнительные сведения см . в разнородном поиске в ассоциативных контейнерах .

Пример

// Requires /std:c++20 or /std:c++latest
#include <set>
#include <iostream>

int main()
{
    std::multiset<int> theMultiSet = {1, 2};

    std::cout << std::boolalpha; // so booleans show as 'true' or 'false'
    std::cout << theMultiSet.contains(2) << '\n';
    std::cout << theMultiSet.contains(3) << '\n';

    return 0;
}
true
false

multiset::count

Возвращает число элементов в контейнере multiset, ключи которых соответствуют ключу, заданному параметром.

size_type count(const Key& key) const;

Параметры

key
Ключ элементов, которые должны быть сопоставлены из multisetэлемента.

Возвращаемое значение

Количество элементов в ключе multiset сортировки, соответствующее ключу параметра.

Замечания

Функция-член возвращает количество элементов x в диапазоне

[ lower_bound(key), upper_bound(key)

Пример

В следующем примере показано использование multisetфункции члена ::count.

// multiset_count.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main()
{
    using namespace std;
    multiset<int> ms1;
    multiset<int>::size_type i;

    ms1.insert(1);
    ms1.insert(1);
    ms1.insert(2);

    // Elements don't need to be unique in multiset,
    // so duplicates are allowed and counted.
    i = ms1.count(1);
    cout << "The number of elements in ms1 with a sort key of 1 is: "
         << i << "." << endl;

    i = ms1.count(2);
    cout << "The number of elements in ms1 with a sort key of 2 is: "
         << i << "." << endl;

    i = ms1.count(3);
    cout << "The number of elements in ms1 with a sort key of 3 is: "
         << i << "." << endl;
}
The number of elements in ms1 with a sort key of 1 is: 2.
The number of elements in ms1 with a sort key of 2 is: 1.
The number of elements in ms1 with a sort key of 3 is: 0.

multiset::crbegin

Возвращает константный итератор, указывающий на первый элемент в обратном мультинаборе.

const_reverse_iterator crbegin() const;

Возвращаемое значение

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

Замечания

crbegin используется с обратным многомножеством так же, как начинается с multiset.

Возвращаемое значение crbeginmultiset объекта невозможно изменить.

crbegin можно использовать для перебора multiset в обратном порядке.

Пример

// multiset_crbegin.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int>::const_reverse_iterator ms1_crIter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );

   ms1_crIter = ms1.crbegin( );
   cout << "The first element in the reversed multiset is "
        << *ms1_crIter << "." << endl;
}
The first element in the reversed multiset is 30.

multiset::crend

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

const_reverse_iterator crend() const;

Возвращаемое значение

Константный обратный двунаправленный итератор, который адресует положение после последнего элемента в обратном мультинаборе (положение, которое предшествовало первому элементу мультинабора до изменения его порядка на противоположный).

Замечания

crend используется с обратным многомножеством так же, как end используется с multiset.

Возвращаемое значение crendmultiset объекта невозможно изменить.

crend используется, чтобы проверить, достиг ли итератор конца multiset.

Возвращаемое crend значение не должно быть разоменовывано.

Пример

// multiset_crend.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main() {
   using namespace std;
   multiset <int> ms1;
   multiset <int>::const_reverse_iterator ms1_crIter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );

   ms1_crIter = ms1.crend( ) ;
   ms1_crIter--;
   cout << "The last element in the reversed multiset is "
        << *ms1_crIter << "." << endl;
}

multiset::difference_type

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

typedef typename allocator_type::difference_type difference_type;

Замечания

difference_type — тип, возвращаемый при вычитании или приращении через итераторы контейнера. difference_type обычно используется для представления количества элементов в диапазоне [ first, last) между итераторами first и last, включая элемент, на который указывает first, и диапазон элементов до, но не включая элемент, на который указывает last.

Хотя difference_type он доступен для всех итераторов, удовлетворяющих требованиям входного итератора, который включает класс двунаправленных итераторов, поддерживаемых обратимыми контейнерами, например набором, вычитание между итераторами поддерживается только итераторами случайного доступа, предоставляемыми контейнером случайного доступа, например вектором.

Пример

// multiset_diff_type.cpp
// compile with: /EHsc
#include <iostream>
#include <set>
#include <algorithm>

int main( )
{
   using namespace std;

   multiset <int> ms1;
   multiset <int>::iterator ms1_Iter, ms1_bIter, ms1_eIter;

   ms1.insert( 20 );
   ms1.insert( 10 );
   ms1.insert( 20 );

   ms1_bIter = ms1.begin( );
   ms1_eIter = ms1.end( );

   multiset <int>::difference_type   df_typ5, df_typ10, df_typ20;

   df_typ5 = count( ms1_bIter, ms1_eIter, 5 );
   df_typ10 = count( ms1_bIter, ms1_eIter, 10 );
   df_typ20 = count( ms1_bIter, ms1_eIter, 20 );

   // The keys, and hence the elements, of a multiset aren't unique
   cout << "The number '5' occurs " << df_typ5
        << " times in multiset ms1.\n";
   cout << "The number '10' occurs " << df_typ10
        << " times in multiset ms1.\n";
   cout << "The number '20' occurs " << df_typ20
        << " times in multiset ms1.\n";

   // Count the number of elements in a multiset
   multiset <int>::difference_type  df_count = 0;
   ms1_Iter = ms1.begin( );
   while ( ms1_Iter != ms1_eIter)
   {
      df_count++;
      ms1_Iter++;
   }

   cout << "The number of elements in the multiset ms1 is: "
        << df_count << "." << endl;
}
The number '5' occurs 0 times in multiset ms1.
The number '10' occurs 1 times in multiset ms1.
The number '20' occurs 2 times in multiset ms1.
The number of elements in the multiset ms1 is: 3.

multiset::emplace

Вставляет созданный элемент на место (операции копирования или перемещения не выполняются) с указанием о размещении.

template <class... Args>
iterator emplace(Args&&... args);

Параметры

args
Аргументы, пересылаемые для создания элемента, вставляемого в объект multiset.

Возвращаемое значение

Итератор, указывающий на вновь вставленный элемент.

Замечания

Эта функция не делает недействительными ссылки на элементы контейнера, но она может сделать недействительными все итераторы контейнера.

При создании исключения состояние контейнера не изменяется.

Пример

// multiset_emplace.cpp
// compile with: /EHsc
#include <set>
#include <string>
#include <iostream>

using namespace std;

template <typename S> void print(const S& s) {
    cout << s.size() << " elements: ";

    for (const auto& p : s) {
        cout << "(" << p << ") ";
    }

    cout << endl;
}

int main()
{
    multiset<string> s1;

    s1.emplace("Anna");
    s1.emplace("Bob");
    s1.emplace("Carmine");

    cout << "multiset modified, now contains ";
    print(s1);
    cout << endl;

    s1.emplace("Bob");

    cout << "multiset modified, now contains ";
    print(s1);
    cout << endl;
}

multiset::emplace_hint

Вставляет созданный элемент на место (операции копирования или перемещения не выполняются) с указанием о размещении.

template <class... Args>
iterator emplace_hint(
    const_iterator where,
    Args&&... args);

Параметры

args
Аргументы, пересылаемые для создания элемента, вставляемого в объект multiset.

where
Место начала поиска правильной точки вставки. (Если эта точка находится непосредственно перед where, вставка может быть выполнена в постоянном времени с поправкой на амортизацию, а не в логарифмическом времени.)

Возвращаемое значение

Итератор, указывающий на вновь вставленный элемент.

Замечания

Эта функция не делает недействительными ссылки на элементы контейнера, но она может сделать недействительными все итераторы контейнера.

При создании исключения состояние контейнера не изменяется.

Пример кода см. в разделе set::emplace_hint.

multiset::empty

Проверяет, пуст ли multiset.

bool empty() const;

Возвращаемое значение

truemultiset Значение , если multiset значение не false является пустым.

Пример

// multiset_empty.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main()
{
   using namespace std;
   multiset <int> ms1, ms2;
   ms1.insert ( 1 );

   if ( ms1.empty( ) )
      cout << "The multiset ms1 is empty." << endl;
   else
      cout << "The multiset ms1 is not empty." << endl;

   if ( ms2.empty( ) )
      cout << "The multiset ms2 is empty." << endl;
   else
      cout << "The multiset ms2 is not empty." << endl;
}
The multiset ms1 is not empty.
The multiset ms2 is empty.

multiset::end

Возврат итератора после конца.

const_iterator end() const;

iterator end();

Возвращаемое значение

Итератор после конца. Если multiset является пустым, то multiset::end() == multiset::begin().

Замечания

end используется для проверки того, прошел ли итератор конец его многосети.

Возвращаемое end значение не должно быть разоменовывано.

Пример кода см. в разделе multiset::find.

multiset::equal_range

Возвращает пару итераторов соответственно на первый элемент в multiset с ключом, который больше, чем указанный ключ, и на первый элемент в multiset с ключом, который больше или равен данному ключу.

pair <const_iterator, const_iterator> equal_range (const Key& key) const;

pair <iterator, iterator> equal_range (const Key& key);

Параметры

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

Возвращаемое значение

Пара итераторов, так что первый является lower_bound ключом, а второй — upper_bound ключом.

Для доступа к первому итератору пары pr, возвращаемой функцией-членом, нужно использовать pr. first, а также для расшифровки нижней границы итератора, используйте *( pr). first Для доступа к второму итератору пары pr, возвращаемой функцией-членом, нужно использовать pr. second, а также для разыменовки верхнего итератора, используйте *( pr). second

Пример

// multiset_equal_range.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   typedef multiset<int, less<int> > IntSet;
   IntSet ms1;
   multiset <int> :: const_iterator ms1_RcIter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );

   pair <IntSet::const_iterator, IntSet::const_iterator> p1, p2;
   p1 = ms1.equal_range( 20 );

   cout << "The upper bound of the element with "
        << "a key of 20 in the multiset ms1 is: "
        << *( p1.second ) << "." << endl;

   cout << "The lower bound of the element with "
        << "a key of 20 in the multiset ms1 is: "
        << *( p1.first ) << "." << endl;

   // Compare the upper_bound called directly
   ms1_RcIter = ms1.upper_bound( 20 );
   cout << "A direct call of upper_bound( 20 ) gives "
        << *ms1_RcIter << "," << endl
        << "matching the 2nd element of the pair"
        << " returned by equal_range( 20 )." << endl;

   p2 = ms1.equal_range( 40 );

   // If no match is found for the key,
   // both elements of the pair return end( )
   if ( ( p2.first == ms1.end( ) ) && ( p2.second == ms1.end( ) ) )
      cout << "The multiset ms1 doesn't have an element "
              << "with a key less than 40." << endl;
   else
      cout << "The element of multiset ms1 with a key >= 40 is: "
                << *( p1.first ) << "." << endl;
}
The upper bound of the element with a key of 20 in the multiset ms1 is: 30.
The lower bound of the element with a key of 20 in the multiset ms1 is: 20.
A direct call of upper_bound( 20 ) gives 30,
matching the 2nd element of the pair returned by equal_range( 20 ).
The multiset ms1 doesn't have an element with a key less than 40.

multiset::erase

Удаляет элемент или диапазон элементов в multiset с заданных позиций или удаляет элементы, соответствующие заданному ключу.

iterator erase(
    const_iterator Where);

iterator erase(
    const_iterator First,
    const_iterator Last);

size_type erase(
    const key_type& Key);

Параметры

Where
Положение удаляемого элемента.

First
Положение первого удаляемого элемента.

Last
Позиция после последнего элемента для удаления.

key
Значение ключа удаляемых элементов.

Возвращаемое значение

Для первых двух функций-членов двунаправленный итератор, указывающий первый элемент, оставшийся за пределами удаленных элементов, или элемент, который является концом multiset такого элемента, если такой элемент не существует.

Для третьей функции-члена возвращает количество элементов, которые были удалены из элемента multiset.

Замечания

Пример кода см. в разделе set::erase.

multiset::find

Возвращает итератор, ссылающийся на расположение элемента в multiset элементе с ключом, эквивалентным указанному ключу.

iterator find(const Key& key);

const_iterator find(const Key& key) const;

Параметры

key
Значение ключа, которое должно соответствовать ключу сортировки элемента из выполняемого multiset поиска.

Возвращаемое значение

Итератор, ссылающийся на расположение элемента с указанным ключом, или расположение, успешное выполнение последнего элемента в multiset ( multiset::end()), если совпадение не найдено для ключа.

Замечания

Функция-член возвращает итератор, ссылающийся на элемент в multiset ключе, ключ которого эквивалентен аргументу key в двоичном предикате, который вызывает упорядочение на основе меньшего отношения сравнения.

Если возвращаемое значение find назначено объекту const_iterator, multiset объект нельзя изменить. Если возвращаемое значение find назначено объекту iterator, multiset его можно изменить.

Пример

// compile with: /EHsc /W4 /MTd
#include <set>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename T> void print_elem(const T& t) {
    cout << "(" << t << ") ";
}

template <typename T> void print_collection(const T& t) {
    cout << t.size() << " elements: ";

    for (const auto& p : t) {
        print_elem(p);
    }
    cout << endl;
}

template <typename C, class T> 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 << endl;
    } else {
        cout << "Element not found." << endl;
    }
}

int main()
{
    multiset<int> s1({ 40, 45 });
    cout << "The starting multiset s1 is: " << endl;
    print_collection(s1);

    vector<int> v;
    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

    cout << "Inserting the following vector data into s1: " << endl;
    print_collection(v);

    s1.insert(v.begin(), v.end());

    cout << "The modified multiset s1 is: " << endl;
    print_collection(s1);
    cout << endl;
    findit(s1, 45);
    findit(s1, 6);
}

multiset::get_allocator

Возвращает копию объекта распределителя, используемого для создания multisetобъекта.

allocator_type get_allocator() const;

Возвращаемое значение

Распределитель, используемый параметром multiset.

Замечания

Распределители для multiset класса указывают, как класс управляет хранилищем. Распределители по умолчанию для классов контейнеров из стандартной библиотеки C++ достаточны для большинства задач программирования. Написание и использование собственного класса распределителя требует расширенных навыков работы с C++.

Пример

// multiset_get_allocator.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int>::allocator_type ms1_Alloc;
   multiset <int>::allocator_type ms2_Alloc;
   multiset <double>::allocator_type ms3_Alloc;
   multiset <int>::allocator_type ms4_Alloc;

   // The following lines declare objects
   // that use the default allocator.
   multiset <int> ms1;
   multiset <int, allocator<int> > ms2;
   multiset <double, allocator<double> > ms3;

   cout << "The number of integers that can be allocated"
        << endl << "before free memory is exhausted: "
        << ms2.max_size( ) << "." << endl;

   cout << "The number of doubles that can be allocated"
        << endl << "before free memory is exhausted: "
        << ms3.max_size( ) <<  "." << endl;

   // The following lines create a multiset ms4
   // with the allocator of multiset ms1
   ms1_Alloc = ms1.get_allocator( );
   multiset <int> ms4( less<int>( ), ms1_Alloc );
   ms4_Alloc = ms4.get_allocator( );

   // Two allocators are interchangeable if
   // storage allocated from each can be
   // deallocated with the other
   if( ms1_Alloc == ms4_Alloc )
   {
      cout << "Allocators are interchangeable."
           << endl;
   }
   else
   {
      cout << "Allocators are not interchangeable."
           << endl;
   }
}

multiset::insert

Вставляет элемент или диапазон элементов в multiset.

// (1) single element
pair<iterator, bool> insert(
    const value_type& Val);

// (2) single element, perfect forwarded
template <class ValTy>
pair<iterator, bool>
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 <class ValTy>
iterator insert(
    const_iterator Where,
    ValTy&& Val);

// (5) range
template <class InputIterator>
void insert(
    InputIterator First,
    InputIterator Last);

// (6) initializer list
void insert(
    initializer_list<value_type>
IList);

Параметры

Val
Значение элемента, который необходимо вставить в multiset.

Where
Место начала поиска правильной точки вставки. (Если эта точка находится непосредственно перед Where, вставка может быть выполнена в постоянном времени с поправкой на амортизацию, а не в логарифмическом времени.)

ValTy
Параметр шаблона, указывающий тип аргумента, который multiset можно использовать для создания элемента value_typeи идеальной пересылки Val в качестве аргумента.

First
Позиция первого элемента, который следует скопировать.

Last
Позиция непосредственно перед последним элементом, который следует скопировать.

1
Аргумент функции шаблона, который соответствует требованиям input_iterator_tag , указывающим на элементы типа, который можно использовать для создания 1 объектов.

IList
Объект initializer_list , из которого нужно скопировать элементы.

Возвращаемое значение

Функции-члены с одним элементом (1) и (2) возвращают итератор в положение, в котором вставляется multisetновый элемент.

Одноэлементные функции-члены с указанием (3) и (4) возвращают итератор, указывающий на положение, в котором был вставлен multisetновый элемент.

Замечания

Эта функция не делает никакие указатели или ссылки недействительными, но она может сделать недействительными все итераторы контейнера.

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

Контейнер value_type является типом, который принадлежит контейнеру, а для набора multiset<V>::value_type — тип const V.

Функция-член диапазона (5) вставляет последовательность значений multiset элементов в элемент, соответствующий каждому элементу, адресуемого итератором в диапазоне [First, Last); поэтому Last не вставляется. Контейнер функции-члена end() ссылается на позицию сразу после последнего элемента в контейнере. Например, оператор s.insert(v.begin(), v.end()); пытается вставить все элементы v в s.

Функция-член списка инициализатора (6) использует initializer_list для копирования элементов в элемент multiset.

Для вставки элемента, созданного на месте, то есть операции копирования или перемещения не выполняются, см multiset::emplace . и multiset::emplace_hint.

Пример

// multiset_insert.cpp
// compile with: /EHsc
#include <set>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

template <typename S> void print(const S& s) {
    cout << s.size() << " elements: ";

    for (const auto& p : s) {
        cout << "(" << p << ") ";
    }

    cout << endl;
}

int main()
{
    // insert single values
    multiset<int> s1;
    // call insert(const value_type&) version
    s1.insert({ 1, 10 });
    // call insert(ValTy&&) version
    s1.insert(20);

    cout << "The original multiset values of s1 are:" << endl;
    print(s1);

    // intentionally attempt a duplicate, single element
    s1.insert(1);
    cout << "The modified multiset values of s1 are:" << endl;
    print(s1);
    cout << endl;

    // single element, with hint
    s1.insert(s1.end(), 30);
    cout << "The modified multiset values of s1 are:" << endl;
    print(s1);
    cout << endl;

    // The templatized version inserting a jumbled range
    multiset<int> s2;
    vector<int> 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 multiset values of s2 are:" << endl;
    print(s2);
    cout << endl;

    // The templatized versions move-constructing elements
    multiset<string>  s3;
    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;

    multiset<int> s4;
    // Insert the elements from an initializer_list
    s4.insert({ 4, 44, 2, 22, 3, 33, 1, 11, 5, 55 });
    cout << "After initializer_list insertion, s4 contains:" << endl;
    print(s4);
    cout << endl;
}

multiset::iterator

Тип, предоставляющий двунаправленный итератор констант, который может считывать любой элемент в объектеmultiset.

typedef implementation-defined iterator;

Пример

Пример начала см. в примере объявления и использованияiterator.

multiset::key_comp

Извлекает копию объекта сравнения, который используется для упорядочивания ключей в контейнере multiset.

key_compare key_comp() const;

Возвращаемое значение

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

Более подробную информацию по Compare см. в разделе "Примечания" в документации к классу multiset.

Замечания

Сохраненный объект определяет функцию-член:

bool operator( const Key&x, const Key&y);

которая возвращает true, если x строго предшествует y в порядке сортировки.

Оба key_compare и value_compare являются синонимами для параметра Compareшаблона. Оба типа предоставляются для набора классов и нескольких наборов, где они идентичны, для совместимости с картой классов и мультикартой, где они отличаются.

Пример

// multiset_key_comp.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;

   multiset <int, less<int> > ms1;
   multiset <int, less<int> >::key_compare kc1 = ms1.key_comp( ) ;
   bool result1 = kc1( 2, 3 ) ;
   if( result1 == true )
   {
      cout << "kc1( 2,3 ) returns value of true, "
           << "where kc1 is the function object of s1."
           << endl;
   }
   else
   {
      cout << "kc1( 2,3 ) returns value of false "
           << "where kc1 is the function object of ms1."
           << endl;
   }

   multiset <int, greater<int> > ms2;
   multiset <int, greater<int> >::key_compare kc2 = ms2.key_comp( ) ;
   bool result2 = kc2( 2, 3 ) ;
   if( result2 == true )
   {
      cout << "kc2( 2,3 ) returns value of true, "
           << "where kc2 is the function object of ms2."
           << endl;
   }
   else
   {
      cout << "kc2( 2,3 ) returns value of false, "
           << "where kc2 is the function object of ms2."
           << endl;
   }
}
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 ms2.

multiset::key_compare

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

typedef Compare key_compare;

Замечания

key_compare является синонимом для параметра-шаблона Compare.

Дополнительные сведения см. в разделе "Примечания Compare" раздела multiset "Класс ".

Пример

Пример объявления и использования key_compareсм. в примереkey_comp.

multiset::key_type

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

typedef Key key_type;

Замечания

key_type является синонимом для параметра-шаблона Key.

Дополнительные сведения см. в разделе "Примечания Key" раздела multiset "Класс ".

Пример

Пример объявления и использования key_typeсм. в примереvalue_type.

multiset::lower_bound

Возвращает итератор, указывающий на первый элемент в multiset с ключом, который больше или равен указанному ключу.

const_iterator lower_bound(const Key& key) const;

iterator lower_bound(const Key& key);

Параметры

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

Возвращаемое значение

const_iterator Или iterator адресирует расположение элемента в multiset том, что с ключом, равным или больше ключа аргумента, или адресирует расположение, успешное выполнение последнего элемента в multiset случае, если совпадение не найдено для ключа.

Пример

// multiset_lower_bound.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int> :: const_iterator ms1_AcIter, ms1_RcIter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );

   ms1_RcIter = ms1.lower_bound( 20 );
   cout << "The element of multiset ms1 with a key of 20 is: "
        << *ms1_RcIter << "." << endl;

   ms1_RcIter = ms1.lower_bound( 40 );

   // If no match is found for the key, end( ) is returned
   if ( ms1_RcIter == ms1.end( ) )
      cout << "The multiset ms1 doesn't have an element "
           << "with a key of 40." << endl;
   else
      cout << "The element of multiset ms1 with a key of 40 is: "
           << *ms1_RcIter << "." << endl;

   // The element at a specific location in the multiset can be
   // found using a dereferenced iterator addressing the location
   ms1_AcIter = ms1.end( );
   ms1_AcIter--;
   ms1_RcIter = ms1.lower_bound( *ms1_AcIter );
   cout << "The element of ms1 with a key matching "
        << "that of the last element is: "
        << *ms1_RcIter << "." << endl;
}
The element of multiset ms1 with a key of 20 is: 20.
The multiset ms1 doesn't have an element with a key of 40.
The element of ms1 with a key matching that of the last element is: 30.

multiset::max_size

Возвращает максимальную длину multiset.

size_type max_size() const;

Возвращаемое значение

Максимальная возможная длина multiset.

Пример

// multiset_max_size.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int>::size_type i;

   i = ms1.max_size( );
   cout << "The maximum possible length "
        << "of the multiset is " << i << "." << endl;
}

multiset::multiset

Создает контейнер multiset, который является пустым или копией части или целого другого контейнера multiset.

multiset();

explicit multiset (
    const Compare& Comp);

multiset (
    const Compare& Comp,
    const Allocator& Al);

multiset(
    const multiset& Right);

multiset(
    multiset&& Right);

multiset(
    initializer_list<Type> IList);

multiset(
    initializer_list<Type> IList,
    const Compare& Comp);

multiset(
    initializer_list<Type> IList,
    const Compare& Comp,
    const Allocator& Al);

template <class InputIterator>
multiset (
    InputIterator First,
    InputIterator Last);

template <class InputIterator>
multiset (
    InputIterator First,
    InputIterator Last,
    const Compare& Comp);

template <class InputIterator>
multiset (
    InputIterator First,
    InputIterator Last,
    const Compare& Comp,
    const Allocator& Al);

Параметры

Al
Класс распределителя памяти, который будет использоваться для этого объекта-мультинабора. Значение по умолчанию — Allocator.

Comp
Функция сравнения типа const Compare, используемая для упорядочивания элементов в multiset. Значение по умолчанию — Compare.

Right
то multiset , какой созданный мультисеть должен быть копией.

First
Положение первого элемента в диапазоне копируемых элементов.

Last
Положение первого элемента после диапазона копируемых элементов.

IList
Объект initializer_list , из которого нужно скопировать элементы.

Замечания

Все конструкторы хранят тип объекта распределителя, который управляет хранилищем памяти для этого multiset объекта, а затем может быть возвращен вызовом get_allocator. Параметр распределителя часто опускается в объявлениях классов и макросах предварительной обработки, используемых для замены альтернативных распределителей.

Все конструкторы инициализируют свои мультинаборы.

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

Первые три конструктора указывают пустой начальный мультисеть, вторую, указывающую тип функции сравнения (Comp) для установки порядка элементов и третьего явного указания типа распределителя (Al) для использования. Ключевое слово explicit подавляет определенные виды автоматического преобразования типов.

Четвертый конструктор указывает копию multisetRight.

Пятый конструктор задает копию multiset путем перемещения Right.

6-й, 7-й и 8-й конструкторы указывают initializer_list, из которых нужно скопировать элементы.

Следующие три конструктора копируют диапазон с [First, Last)multiset увеличением явности при указании типа функции сравнения и распределителя.

Пример

// multiset_ctor.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main()
{
    using namespace std;
    //multiset <int>::iterator ms1_Iter, ms2_Iter, ms3_Iter;
    multiset <int>::iterator ms4_Iter, ms5_Iter, ms6_Iter, ms7_Iter;

    // Create an empty multiset ms0 of key type integer
    multiset <int> ms0;

    // Create an empty multiset ms1 with the key comparison
    // function of less than, then insert 4 elements
    multiset <int, less<int> > ms1;
    ms1.insert(10);
    ms1.insert(20);
    ms1.insert(20);
    ms1.insert(40);

    // Create an empty multiset ms2 with the key comparison
    // function of greater than, then insert 2 elements
    multiset <int, less<int> > ms2;
    ms2.insert(10);
    ms2.insert(20);

    // Create a multiset ms3 with the
    // allocator of multiset ms1
    multiset <int>::allocator_type ms1_Alloc;
    ms1_Alloc = ms1.get_allocator();
    multiset <int> ms3(less<int>(), ms1_Alloc);
    ms3.insert(30);

    // Create a copy, multiset ms4, of multiset ms1
    multiset <int> ms4(ms1);

    // Create a multiset ms5 by copying the range ms1[ first,  last)
    multiset <int>::const_iterator ms1_bcIter, ms1_ecIter;
    ms1_bcIter = ms1.begin();
    ms1_ecIter = ms1.begin();
    ms1_ecIter++;
    ms1_ecIter++;
    multiset <int> ms5(ms1_bcIter, ms1_ecIter);

    // Create a multiset ms6 by copying the range ms4[ first,  last)
    // and with the allocator of multiset ms2
    multiset <int>::allocator_type ms2_Alloc;
    ms2_Alloc = ms2.get_allocator();
    multiset <int> ms6(ms4.begin(), ++ms4.begin(), less<int>(), ms2_Alloc);

    cout << "ms1 =";
    for (auto i : ms1)
        cout << " " << i;
    cout << endl;

    cout << "ms2 =";
    for (auto i : ms2)
        cout << " " << i;
   cout << endl;

   cout << "ms3 =";
   for (auto i : ms3)
       cout << " " << i;
    cout << endl;

    cout << "ms4 =";
    for (auto i : ms4)
        cout << " " << i;
    cout << endl;

    cout << "ms5 =";
    for (auto i : ms5)
        cout << " " << i;
    cout << endl;

    cout << "ms6 =";
    for (auto i : ms6)
        cout << " " << i;
    cout << endl;

    // Create a multiset by moving ms5
    multiset<int> ms7(move(ms5));
    cout << "ms7 =";
    for (auto i : ms7)
        cout << " " << i;
    cout << endl;

    // Create a multiset with an initializer_list
    multiset<int> ms8({1, 2, 3, 4});
    cout << "ms8=";
    for (auto i : ms8)
        cout << " " << i;
    cout << endl;
}

multiset::operator=

Заменяет элементы этого multiset элементами из другого multiset.

multiset& operator=(const multiset& right);

multiset& operator=(multiset&& right);

Параметры

Right
multiset, из которого копируются или перемещаются элементы.

Замечания

operator= копирует или перемещает элементы Right в этот multiset в зависимости от типа используемой ссылки (lvalue или rvalue). Элементы, которые находились в этом multiset перед выполнением operator=, игнорируются.

Пример

// multiset_operator_as.cpp
// compile with: /EHsc
#include <multiset>
#include <iostream>

int main( )
   {
   using namespace std;
   multiset<int> v1, v2, v3;
   multiset<int>::iterator iter;

   v1.insert(10);

   cout << "v1 = " ;
   for (iter = v1.begin(); iter != v1.end(); iter++)
      cout << *iter << " ";
   cout << endl;

   v2 = v1;
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;

// move v1 into v2
   v2.clear();
   v2 = move(v1);
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;
   }

multiset::pointer

Тип, предоставляющий указатель на элемент в multiset.

typedef typename allocator_type::pointer pointer;

Замечания

Тип pointer можно использовать для изменения значения элемента.

В большинстве случаев итератор должен использоваться для доступа к элементам в объекте multiset .

multiset::rbegin

Возвращает итератор, который указывает на первый элемент в обратном мультинаборе.

const_reverse_iterator rbegin() const;

reverse_iterator rbegin();

Возвращаемое значение

Обратный двунаправленный итератор, обращаюющийся к первому элементу в обратном направлении multiset или адресующий то, что было последним элементом в непровернутом multiset.

Замечания

rbegin используется с обратным multiset так же, как rbegin используется с multiset.

Если возвращаемое значение rbegin назначено объекту const_reverse_iterator, multiset объект не может быть изменен. Если возвращаемое значение rbegin назначено объекту reverse_iterator, multiset его можно изменить.

rbegin можно использовать для перебора multiset в обратном порядке.

Пример

// multiset_rbegin.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int>::iterator ms1_Iter;
   multiset <int>::reverse_iterator ms1_rIter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );

   ms1_rIter = ms1.rbegin( );
   cout << "The first element in the reversed multiset is "
        << *ms1_rIter << "." << endl;

   // begin can be used to start an iteration
   // through a multiset in a forward order
   cout << "The multiset is:";
   for ( ms1_Iter = ms1.begin( ) ; ms1_Iter != ms1.end( ); ms1_Iter++ )
      cout << " " << *ms1_Iter;
   cout << endl;

   // rbegin can be used to start an iteration
   // through a multiset in a reverse order
   cout << "The reversed multiset is:";
   for ( ms1_rIter = ms1.rbegin( ) ; ms1_rIter != ms1.rend( ); ms1_rIter++ )
      cout << " " << *ms1_rIter;
   cout << endl;

   // a multiset element can be erased by dereferencing to its key
   ms1_rIter = ms1.rbegin( );
   ms1.erase ( *ms1_rIter );

   ms1_rIter = ms1.rbegin( );
   cout << "After the erasure, the first element "
        << "in the reversed multiset is "<< *ms1_rIter << "."
        << endl;
}
The first element in the reversed multiset is 30.
The multiset is: 10 20 30
The reversed multiset is: 30 20 10
After the erasure, the first element in the reversed multiset is 20.

multiset::reference

Тип, предоставляющий ссылку на элемент, хранящийся в контейнере multiset.

typedef typename allocator_type::reference reference;

Пример

// multiset_ref.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;

   ms1.insert( 10 );
   ms1.insert( 20 );

   // Declare and initialize a reference &Ref1 to the 1st element
   const int &Ref1 = *ms1.begin( );

   cout << "The first element in the multiset is "
        << Ref1 << "." << endl;
}
The first element in the multiset is 10.

multiset::rend

Возвращает итератор, который обращается к месту, следующему за последним элементом в обращенном контейнере multiset.

const_reverse_iterator rend() const;

reverse_iterator rend();

Возвращаемое значение

Обратный двунаправленный итератор, который обращается к расположению, успешному последнему элементу в обратном multiset направлении (расположение, которое предшествовало первому элементу в непровернутом multiset).

Замечания

rend используется с обратным многомножеством так же, как end используется с multiset.

Если возвращаемое значение rend назначено объекту const_reverse_iterator, multiset объект не может быть изменен. Если возвращаемое значение rend назначено объекту reverse_iterator, multiset его можно изменить.

rend можно использовать для проверки, достиг ли обратный итератор конца своего мультинабора.

Возвращаемое rend значение не должно быть разоменовывано.

Пример

// multiset_rend.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main() {
   using namespace std;
   multiset <int> ms1;
   multiset <int>::iterator ms1_Iter;
   multiset <int>::reverse_iterator ms1_rIter;
   multiset <int>::const_reverse_iterator ms1_crIter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );

   ms1_rIter = ms1.rend( ) ;
   ms1_rIter--;
   cout << "The last element in the reversed multiset is "
        << *ms1_rIter << "." << endl;

   // end can be used to terminate an iteration
   // through a multiset in a forward order
   cout << "The multiset is: ";
   for ( ms1_Iter = ms1.begin( ) ; ms1_Iter != ms1.end( ); ms1_Iter++ )
      cout << *ms1_Iter << " ";
   cout << "." << endl;

   // rend can be used to terminate an iteration
   // through a multiset in a reverse order
   cout << "The reversed multiset is: ";
   for ( ms1_rIter = ms1.rbegin( ) ; ms1_rIter != ms1.rend( ); ms1_rIter++ )
      cout << *ms1_rIter << " ";
   cout << "." << endl;

   ms1_rIter = ms1.rend( );
   ms1_rIter--;
   ms1.erase ( *ms1_rIter );

   ms1_rIter = ms1.rend( );
   --ms1_rIter;
   cout << "After the erasure, the last element in the "
        << "reversed multiset is " << *ms1_rIter << "." << endl;
}

multiset::reverse_iterator

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

typedef std::reverse_iterator<iterator> reverse_iterator;

Замечания

Тип reverse_iterator используется для итерации в обратном multiset направлении.

Пример

Пример объявления и использования reverse_iteratorсм. в примереrbegin.

multiset::size

Возвращает количество элементов в контейнере multiset.

size_type size() const;

Возвращаемое значение

Текущая длина multiset.

Пример

// multiset_size.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int> :: size_type i;

   ms1.insert( 1 );
   i = ms1.size( );
   cout << "The multiset length is " << i << "." << endl;

   ms1.insert( 2 );
   i = ms1.size( );
   cout << "The multiset length is now " << i << "." << endl;
}
The multiset length is 1.
The multiset length is now 2.

multiset::size_type

Целочисленный Typedef без знака, который может представлять число элементов в multiset.

typedef typename allocator_type::size_type size_type;

Пример

Пример size объявления и использования size_type

multiset::swap

Меняет местами элементы двух мультинаборов.

void swap(
    multiset<Key, Compare, Allocator>& right);

Параметры

Right
Мультинабор-аргумент, который предоставляет элементы для обмена с элементами целевого мультинабора.

Замечания

Функция-член не делает недействительными никакие ссылки, указатели или итераторы, которые обозначают элементы в двух мультинаборах, элементы которых обмениваются.

Пример

// multiset_swap.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1, ms2, ms3;
   multiset <int>::iterator ms1_Iter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );
   ms2.insert( 100 );
   ms2.insert( 200 );
   ms3.insert( 300 );

   cout << "The original multiset ms1 is:";
   for ( ms1_Iter = ms1.begin( ); ms1_Iter != ms1.end( ); ms1_Iter++ )
      cout << " " << *ms1_Iter;
   cout << "." << endl;

   // This is the member function version of swap
   ms1.swap( ms2 );

   cout << "After swapping with ms2, list ms1 is:";
   for ( ms1_Iter = ms1.begin( ); ms1_Iter != ms1.end( ); ms1_Iter++ )
      cout << " " << *ms1_Iter;
   cout << "." << endl;

   // This is the specialized template version of swap
   swap( ms1, ms3 );

   cout << "After swapping with ms3, list ms1 is:";
   for ( ms1_Iter = ms1.begin( ); ms1_Iter != ms1.end( ); ms1_Iter++ )
      cout << " " << *ms1_Iter;
   cout   << "." << endl;
}
The original multiset ms1 is: 10 20 30.
After swapping with ms2, list ms1 is: 100 200.
After swapping with ms3, list ms1 is: 300.

multiset::upper_bound

Возвращает итератор, указывающий на первый элемент в multiset с ключом, который больше указанного ключа.

const_iterator upper_bound(const Key& key) const;

iterator upper_bound(const Key& key);

Параметры

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

Возвращаемое значение

Итератор или const_iterator адресация расположения элемента в multiset ключе с ключом, превышающим ключ аргумента, или адресует расположение, успешное выполнение последнего элемента в multiset случае, если совпадение не найдено для ключа.

Пример

// multiset_upper_bound.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int> :: const_iterator ms1_AcIter, ms1_RcIter;

   ms1.insert( 10 );
   ms1.insert( 20 );
   ms1.insert( 30 );

   ms1_RcIter = ms1.upper_bound( 20 );
   cout << "The first element of multiset ms1 with a key greater "
           << "than 20 is: " << *ms1_RcIter << "." << endl;

   ms1_RcIter = ms1.upper_bound( 30 );

   // If no match is found for the key, end( ) is returned
   if ( ms1_RcIter == ms1.end( ) )
      cout << "The multiset ms1 doesn't have an element "
              << "with a key greater than 30." << endl;
   else
      cout << "The element of multiset ms1 with a key > 40 is: "
           << *ms1_RcIter << "." << endl;

   // The element at a specific location in the multiset can be
   // found using a dereferenced iterator addressing the location
   ms1_AcIter = ms1.begin( );
   ms1_RcIter = ms1.upper_bound( *ms1_AcIter );
   cout << "The first element of ms1 with a key greater than"
        << endl << "that of the initial element of ms1 is: "
        << *ms1_RcIter << "." << endl;
}
The first element of multiset ms1 with a key greater than 20 is: 30.
The multiset ms1 doesn't have an element with a key greater than 30.
The first element of ms1 with a key greater than
that of the initial element of ms1 is: 20.

multiset::value_comp

Извлекает копию объекта сравнения, который используется для упорядочивания значений элементов в наборе multiset.

value_compare value_comp() const;

Возвращаемое значение

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

Дополнительные сведения см. в разделе "Примечания Compare" раздела multiset "Класс ".

Замечания

Сохраненный объект определяет функцию-член:

bool operator( const Key&_xVal, const Key&_yVal);

значение true, если _xVal предшествует и не равно _yVal в порядке сортировки.

Оба key_compare и value_compare являются синонимами для параметра Compareшаблона. Оба типа предоставляются для набора классов и multiset, где они идентичны, для совместимости с картой классов и multimap, где они отличаются.

Пример

// multiset_value_comp.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;

   multiset <int, less<int> > ms1;
   multiset <int, less<int> >::value_compare vc1 = ms1.value_comp( );
   bool result1 = vc1( 2, 3 );
   if( result1 == true )
   {
      cout << "vc1( 2,3 ) returns value of true, "
           << "where vc1 is the function object of ms1."
           << endl;
   }
   else
   {
      cout << "vc1( 2,3 ) returns value of false, "
           << "where vc1 is the function object of ms1."
           << endl;
   }

   set <int, greater<int> > ms2;
   set<int, greater<int> >::value_compare vc2 = ms2.value_comp( );
   bool result2 = vc2( 2, 3 );
   if( result2 == true )
   {
      cout << "vc2( 2,3 ) returns value of true, "
           << "where vc2 is the function object of ms2."
           << endl;
   }
   else
   {
      cout << "vc2( 2,3 ) returns value of false, "
           << "where vc2 is the function object of ms2."
           << endl;
   }
}
vc1( 2,3 ) returns value of true, where vc1 is the function object of ms1.
vc2( 2,3 ) returns value of false, where vc2 is the function object of ms2.

multiset::value_compare

Тип, предоставляющий объект функции, который может сравнить два ключа сортировки, чтобы определить их относительный порядок в .multiset

typedef key_compare value_compare;

Замечания

value_compare является синонимом для параметра-шаблона Compare.

Оба key_compare и value_compare являются синонимами для параметра Compareшаблона. Оба типа предоставляются для набора классов и multiset, где они идентичны, для совместимости с картой классов и multimap, где они отличаются.

Более подробную информацию по Compare см. в разделе "Примечания" в документации к классу multiset.

Пример

Пример объявления и использования value_compareсм. в примереvalue_comp.

multiset::value_type

Тип, описывающий объект, хранящийся в качестве multiset элемента в своей емкости в качестве значения.

typedef Key value_type;

Замечания

value_type является синонимом для параметра-шаблона Key.

Оба key_type и value_type являются синонимами для параметра Keyшаблона. Оба типа предоставляются для набора классов и нескольких наборов, где они идентичны, для совместимости с картой классов и мультикартой, где они отличаются.

Более подробную информацию по Key см. в подразделе "Примечания" данного раздела.

Пример

// multiset_value_type.cpp
// compile with: /EHsc
#include <set>
#include <iostream>

int main( )
{
   using namespace std;
   multiset <int> ms1;
   multiset <int>::iterator ms1_Iter;

   multiset <int> :: value_type svt_Int;   // Declare value_type
   svt_Int = 10;             // Initialize value_type

   multiset <int> :: key_type skt_Int;   // Declare key_type
   skt_Int = 20;             // Initialize key_type

   ms1.insert( svt_Int );         // Insert value into s1
   ms1.insert( skt_Int );         // Insert key into s1

   // a multiset accepts key_types or value_types as elements
   cout << "The multiset has elements:";
   for ( ms1_Iter = ms1.begin( ) ; ms1_Iter != ms1.end( ); ms1_Iter++ )
      cout << " " << *ms1_Iter;
   cout << "." << endl;
}
The multiset has elements: 10 20.

См. также

Контейнеры
Потокобезопасность в стандартной библиотеке C++
Справочник по стандартной библиотеке C++