Поделиться через


Класс hash_multiset

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

Синтаксис

template <class Key, class Traits =hash_compare<Key, less <Key>>, class Allocator =allocator <Key>>
class hash_multiset

Параметры

Ключ
Тип данных элемента, который необходимо сохранить в hash_multiset.

Признаки
Тип, включающий два объекта функции, один из классов сравнения классов, который является двоичным предикатом, способным сравнить два значения элементов в виде ключей сортировки, чтобы определить их относительный порядок и хэш-функцию, которая является унарным сопоставлением ключевых значений ключей элементов с неподписанными целыми числами типа size_t. Этот аргумент является необязательным, и в качестве значения по умолчанию используется hash_compare<Key, less<Key> >.

Распределителя
Тип, представляющий сохраненный объект распределителя, который инкапсулирует сведения о выделении и освобождении памяти для hash_multiset. Этот аргумент является необязательным, и в качестве значения по умолчанию используется allocator<Key>.

Замечания

hash_multiset представляет собой следующее:

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

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

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

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

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

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

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

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

Объект hash_multiset упорядочивает управляемую им последовательность путем вызова хранимого объекта хэш-признаков типа value_compare. Доступ к этому хранимому объекту можно получить через вызов функции-члена key_comp. Такой объект функции должен вести себя так же, как объект класса hash_compare<Key, less<Key> >. В частности, для всех значений key of type Keyвызов Trait(Key) выдает распределение значений типа size_t.

В целом, упорядочиваемые элементы должны лишь подлежать сравнению "меньше чем" для установления такого порядка, чтобы, имея любые два элемента, можно было определить, что они равны (ни один не меньше другого) или что один меньше другого. Это приводит к упорядочению неравнозначных элементов. С более технической точки зрения, функция сравнения является бинарным предикатом, который вызывает строгого слабое упорядочение в стандартном математически смысле. Бинарный предикат f( x, y) является объектом-функцией с двумя аргументами — x и y и возвращаемым значением true или false. Порядок в объекте hash_multiset — строгое слабое упорядочивание, если бинарный предикат является нерефлексивным, антисимметричным и транзитивным и если эквивалентность транзитивна, когда два объекта — x и y определяются как эквивалентные, когда и f( x, y), и f( y, x) имеют значение false. Если более строгое условие равенства между ключами заменяет условие эквивалентности, порядок становится общим (т.е. все элементы упорядочиваются относительно друг друга), и сопоставленные ключи будут неотличимы друг от друга.

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

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

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

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

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

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

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

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

Операторы

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

Требования

Заголовок:<hash_set>

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

hash_multiset::allocator_type

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename Traits::value_type, typename Traits::allocator_type>::allocator_type allocator_type;

Пример

См. пример для get_allocator в качестве примера использования allocator_type

hash_multiset::begin

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_iterator begin() const;

iterator begin();

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

Двунаправленный итератор, адресующий первый элемент в объекте hash_multiset или положение после пустого объекта hash_multiset.

Замечания

Если возвращаемое значение begin назначено объекту const_iterator, элементы в объекте hash_multiset нельзя изменить. Если возвращаемое значение begin назначено iteratorобъекту, элементы в объекте hash_multiset можно изменить.

Пример

// hash_multiset_begin.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int>::iterator hms1_Iter;
   hash_multiset <int>::const_iterator hms1_cIter;

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

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

   hms1_Iter = hms1.begin( );
   hms1.erase( hms1_Iter );

   // The following 2 lines would err because the iterator is const
   // hms1_cIter = hms1.begin( );
   // hms1.erase( hms1_cIter );

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

hash_multiset::cbegin

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_iterator cbegin() const;

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

Константный двунаправленный итератор, адресующий первый элемент в hash_multiset или положение после пустого hash_multiset.

Замечания

Если возвращенное значение — cbegin, элементы в объекте hash_multiset изменить нельзя.

Пример

// hash_multiset_cbegin.cpp
// compile with: /EHsc
#include <hash_multiset>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hs1;
   hash_multiset <int>::const_iterator hs1_cIter;

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

   hs1_cIter = hs1.cbegin( );
   cout << "The first element of hs1 is " << *hs1_cIter << endl;
}
The first element of hs1 is 1

hash_multiset::cend

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_iterator cend() const;

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

Константный двунаправленный итератор, адресующий положение после последнего элемента в hash_multiset. Если hash_multiset является пустым, то hash_multiset::cend == hash_multiset::begin.

Замечания

cend используется для проверки, достиг ли итератор конца своего hash_multiset. Значение, возвращаемое cend, не должно быть подвергнуто удалению ссылки.

Пример

// hash_multiset_cend.cpp
// compile with: /EHsc
#include <hash_multiset>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hs1;
   hash_multiset <int> :: const_iterator hs1_cIter;

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

   hs1_cIter = hs1.cend( );
   hs1_cIter--;
   cout << "The last element of hs1 is " << *hs1_cIter << endl;
}
The last element of hs1 is 3

hash_multiset::clear

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Удаляет все элементы объекта hash_multiset.

void clear();

Замечания

Пример

// hash_multiset_clear.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;

   hms1.insert( 1 );
   hms1.insert( 2 );

   cout << "The size of the hash_multiset is initially " << hms1.size( )
        << "." << endl;

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

hash_multiset::const_iterator

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename Traits::value_type, typename Traits::allocator_type>::const_iterator const_iterator;

Замечания

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

Пример

См. пример для begin в качестве примера использования const_iterator.

hash_multiset::const_pointer

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename _Traits::value_type, typename _Traits::allocator_type>::const_pointer const_pointer;

Замечания

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

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

hash_multiset::const_reference

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename _Traits::value_type, typename _Traits::allocator_type>::const_reference const_reference;

Замечания

Пример

// hash_multiset_const_reference.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;

   hms1.insert( 10 );
   hms1.insert( 20 );

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

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

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

hash_multiset::const_reverse_iterator

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename Traits::value_type, typename Traits::allocator_type>::const_reverse_iterator const_reverse_iterator;

Замечания

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

Пример

См. пример для rend в качестве примера объявления и использования const_reverse_iterator.

hash_multiset::count

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

size_type count(const Key& key) const;

Параметры

key
Ключ для сравнения с ключами элементов объекта hash_multiset.

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

Число элементов в объекте hash_multiset с ключом, заданным параметром.

Замечания

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

[ lower_bound(ключ), upper_bound(ключ).

Пример

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

// hash_multiset_count.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
    using namespace std;
    using namespace stdext;
    hash_multiset<int> hms1;
    hash_multiset<int>::size_type i;

    hms1.insert(1);
    hms1.insert(1);

    // Keys do not need to be unique in hash_multiset,
    // so duplicates may exist.
    i = hms1.count(1);
    cout << "The number of elements in hms1 with a sort key of 1 is: "
         << i << "." << endl;

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

hash_multiset::crbegin

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_reverse_iterator crbegin() const;

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

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

Замечания

crbegin используется с обратным hash_multiset так же, как hash_multiset::begin используется с обычным hash_multiset.

Если возвращаемое значение crbegin, то объект hash_multiset невозможно изменить.

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

Пример

// hash_multiset_crbegin.cpp
// compile with: /EHsc
#include <hash_multiset>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hs1;
   hash_multiset <int>::const_reverse_iterator hs1_crIter;

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

   hs1_crIter = hs1.crbegin( );
   cout << "The first element in the reversed hash_multiset is "
        << *hs1_crIter << "." << endl;
}
The first element in the reversed hash_multiset is 30.

hash_multiset::crend

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_reverse_iterator crend() const;

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

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

Замечания

crend используется с обратным hash_multiset так же, как hash_multiset::end используется с обычным hash_multiset.

Если возвращаемое значение crend, то объект hash_multiset невозможно изменить.

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

Пример

// hash_multiset_crend.cpp
// compile with: /EHsc
#include <hash_multiset>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hs1;
   hash_multiset <int>::const_reverse_iterator hs1_crIter;

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

   hs1_crIter = hs1.crend( );
   hs1_crIter--;
   cout << "The last element in the reversed hash_multiset is "
        << *hs1_crIter << "." << endl;
}
The last element in the reversed hash_multiset is 10.

hash_multiset::d ifference_type

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename _Traits::value_type, typename _Traits::allocator_type>::difference_type difference_type;

Замечания

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

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

Пример

// hash_multiset_diff_type.cpp
// compile with: /EHsc
#include <iostream>
#include <hash_set>
#include <algorithm>

int main( )
{
   using namespace std;
   using namespace stdext;

   hash_multiset <int> hms1;
   hash_multiset <int>::iterator hms1_Iter, hms1_bIter, hms1_eIter;

   hms1.insert( 20 );
   hms1.insert( 10 );

   // hash_multiset elements need not be unique
   hms1.insert( 20 );

   hms1_bIter = hms1.begin( );
   hms1_eIter = hms1.end( );

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

   df_typ5 = count( hms1_bIter, hms1_eIter, 5 );
   df_typ10 = count( hms1_bIter, hms1_eIter, 10 );
   df_typ20 = count( hms1_bIter, hms1_eIter, 20 );

   // The keys & hence the elements of a hash_multiset
   // need not be unique and may occur multiple times
   cout << "The number '5' occurs " << df_typ5
        << " times in hash_multiset hms1.\n";
   cout << "The number '10' occurs " << df_typ10
        << " times in hash_multiset hms1.\n";
   cout << "The number '20' occurs " << df_typ20
        << " times in hash_multiset hms1.\n";

   // Count the number of elements in a hash_multiset
   hash_multiset <int>::difference_type  df_count = 0;
   hms1_Iter = hms1.begin( );
   while ( hms1_Iter != hms1_eIter)
   {
      df_count++;
      hms1_Iter++;
   }

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

hash_multiset::emplace

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Вставляет в hash_multiset созданный на месте объект.

template <class ValTy>
iterator insert(ValTy&& val);

Параметры

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

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

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

Замечания

Пример

// hash_multiset_emplace.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>
#include <string>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset<string> hms3;
   string str1("a");

   hms3.emplace(move(str1));
   cout << "After the emplace insertion, hms3 contains "
      << *hms3.begin() << "." << endl;
}
After the emplace insertion, hms3 contains a.

hash_multiset::emplace_hint

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Вставляет созданный на месте элемент в hash_multiset с использованием признака размещения.

template <class ValTy>
iterator insert(
    const_iterator where,
    ValTy&& val);

Параметры

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

where
Место начала поиска правильной точки вставки. (Вставка может происходить в амортизированном времени константы, а не в логарифмическом времени, если точка вставки немедленно следует за местом.)

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

Функция-член hash_multiset::emplace возвращает итератор, указывающий на позицию вставки нового элемента в hash_multiset.

Замечания

Вставка может происходить в амортизированном времени константы вместо логарифмического времени, если точка вставки сразу же следует за местом.

Пример

// hash_multiset_emplace_hint.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>
#include <string>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset<string> hms1;
   string str1("a");

   hms1.insert(hms1.begin(), move(str1));
   cout << "After the emplace insertion, hms1 contains "
      << *hms1.begin() << "." << endl;
}
After the emplace insertion, hms1 contains a.

hash_multiset::empty

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Проверяет объект hash_multiset на пустоту.

bool empty() const;

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

true Значение hash_multiset, если hash_multiset пуст; false Значение , если hash_multiset не является непустимой.

Замечания

Пример

// hash_multiset_empty.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1, hms2;
   hms1.insert ( 1 );

   if ( hms1.empty( ) )
      cout << "The hash_multiset hms1 is empty." << endl;
   else
      cout << "The hash_multiset hms1 is not empty." << endl;

   if ( hms2.empty( ) )
      cout << "The hash_multiset hms2 is empty." << endl;
   else
      cout << "The hash_multiset hms2 is not empty." << endl;
}
The hash_multiset hms1 is not empty.
The hash_multiset hms2 is empty.

hash_multiset::end

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Возвращает итератор, адресующий положение после последнего элемента в hash_multiset.

const_iterator end() const;

iterator end();

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

Двунаправленный итератор, адресующий положение после последнего элемента в hash_multiset. Если hash_multiset пусто, то hash_multiset::end == hash_multiset::begin.

Замечания

end используется для проверки того, достиг ли итератор конца hash_multiset. Значение, возвращаемое end, не должно быть подвергнуто удалению ссылки.

Пример

// hash_multiset_end.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int> :: iterator hms1_Iter;
   hash_multiset <int> :: const_iterator hms1_cIter;

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

   hms1_Iter = hms1.end( );
   hms1_Iter--;
   cout << "The last element of hms1 is " << *hms1_Iter << endl;

   hms1.erase( hms1_Iter );

   // The following 3 lines would err because the iterator is const
   // hms1_cIter = hms1.end( );
   // hms1_cIter--;
   // hms1.erase( hms1_cIter );

   hms1_cIter = hms1.end( );
   hms1_cIter--;
   cout << "The last element of hms1 is now " << *hms1_cIter << endl;
}
The last element of hms1 is 3
The last element of hms1 is now 2

hash_multiset::equal_range

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

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

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

Параметры

key
Аргумент-ключ для сравнения с ключом сортировки элемента из объекта hash_multiset, в котором выполняется поиск.

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

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

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

Пример

// hash_multiset_equal_range.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   typedef hash_multiset<int> IntHSet;
   IntHSet hms1;
   hash_multiset <int> :: const_iterator hms1_RcIter;

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

   pair <IntHSet::const_iterator, IntHSet::const_iterator> p1, p2;
   p1 = hms1.equal_range( 20 );

   cout << "The upper bound of the element with "
        << "a key of 20\nin the hash_multiset hms1 is: "
        << *(p1.second) << "." << endl;

   cout << "The lower bound of the element with "
        << "a key of 20\nin the hash_multiset hms1 is: "
        << *(p1.first) << "." << endl;

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

   p2 = hms1.equal_range( 40 );

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

hash_multiset::erase

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

iterator erase(iterator where);

iterator erase(iterator first, iterator last);

size_type erase(const key_type& key);

Параметры

where
Положение элемента, удаляемого из объекта hash_multiset.

first
Положение первого элемента, удаляемого из объекта hash_multiset.

last
Положение сразу после последнего элемента, удаляемого из объекта hash_multiset.

key
Ключ элементов, удаляемых из объекта hash_multiset.

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

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

Замечания

Функции-члены не создают исключений.

Пример

В следующем примере демонстрируется использование функции-члена hash_multiset::erase.

// hash_multiset_erase.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main()
{
    using namespace std;
    using namespace stdext;
    hash_multiset<int> hms1, hms2, hms3;
    hash_multiset<int> :: iterator pIter, Iter1, Iter2;
    int i;
    hash_multiset<int>::size_type n;

    for (i = 1; i < 5; i++)
    {
        hms1.insert(i);
        hms2.insert(i * i);
        hms3.insert(i - 1);
    }

    // The 1st member function removes an element at a given position
    Iter1 = ++hms1.begin();
    hms1.erase(Iter1);

    cout << "After the 2nd element is deleted,\n"
         << "the hash_multiset hms1 is:" ;
    for (pIter = hms1.begin(); pIter != hms1.end(); pIter++)
        cout << " " << *pIter;
    cout << "." << endl;

    // The 2nd member function removes elements
    // in the range [ first,  last)
    Iter1 = ++hms2.begin();
    Iter2 = --hms2.end();
    hms2.erase(Iter1, Iter2);

    cout << "After the middle two elements are deleted,\n"
         << "the hash_multiset hms2 is:" ;
    for (pIter = hms2.begin(); pIter != hms2.end(); pIter++)
        cout << " " << *pIter;
    cout << "." << endl;

    // The 3rd member function removes elements with a given  key
    n = hms3.erase(2);

    cout << "After the element with a key of 2 is deleted,\n"
         << "the hash_multiset hms3 is:" ;
    for (pIter = hms3.begin(); pIter != hms3.end(); pIter++)
        cout << " " << *pIter;
    cout << "." << endl;

    // The 3rd member function returns the number of elements removed
    cout << "The number of elements removed from hms3 is: "
         << n << "." << endl;

    // The dereferenced iterator can also be used to specify a key
    Iter1 = ++hms3.begin();
    hms3.erase(Iter1);

    cout << "After another element with a key "
         << "equal to that of the 2nd element\n"
         << "is deleted, the hash_multiset hms3 is:" ;
    for (pIter = hms3.begin(); pIter != hms3.end(); pIter++)
        cout << " " << *pIter;
    cout << "." << endl;
}
After the 2nd element is deleted,
the hash_multiset hms1 is: 1 3 4.
After the middle two elements are deleted,
the hash_multiset hms2 is: 16 4.
After the element with a key of 2 is deleted,
the hash_multiset hms3 is: 0 1 3.
The number of elements removed from hms3 is: 1.
After another element with a key equal to that of the 2nd element
is deleted, the hash_multiset hms3 is: 0 3.

hash_multiset::find

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

iterator find(const Key& key);

const_iterator find(const Key& key) const;

Параметры

key
Ключ-аргумент для сопоставления с ключом сортировки элемента объекта hash_multiset, в котором выполняется поиск.

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

Iterator или const_iterator, адресующий положение элемента, эквивалентного указанному ключу, или адресующий положение после последнего элемента в hash_multiset, если соответствие для ключа не найдено.

Замечания

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

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

Пример

// hash_multiset_find.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int> :: const_iterator hms1_AcIter, hms1_RcIter;

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

   hms1_RcIter = hms1.find( 20 );
   cout << "The element of hash_multiset hms1 with a key of 20 is: "
        << *hms1_RcIter << "." << endl;

   hms1_RcIter = hms1.find( 40 );

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

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

hash_multiset::get_allocator

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

Allocator get_allocator() const;

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

Распределитель, используемый объектом hash_multiset для управления памятью. Является параметром-шаблоном класса Allocator.

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

Замечания

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

Пример

// hash_multiset_get_allocator.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;

   // The following lines declare objects
   // that use the default allocator.
   hash_multiset <int, hash_compare <int, less<int> > > hms1;
   hash_multiset <int, hash_compare <int, greater<int> > > hms2;
   hash_multiset <double, hash_compare <double,
      less<double> >, allocator<double> > hms3;

   hash_multiset <int, hash_compare <int,
      greater<int> > >::allocator_type hms2_Alloc;
   hash_multiset <double>::allocator_type hms3_Alloc;
   hms2_Alloc = hms2.get_allocator( );

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

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

   // The following lines create a hash_multiset hms4
   // with the allocator of hash_multiset hms1.
   hash_multiset <int>::allocator_type hms4_Alloc;
   hash_multiset <int> hms4;
   hms4_Alloc = hms2.get_allocator( );

   // Two allocators are interchangeable if
   // storage allocated from each can be
   // deallocated by the other
   if( hms2_Alloc == hms4_Alloc )
   {
      cout << "The allocators are interchangeable."
           << endl;
   }
   else
   {
      cout << "The allocators are not interchangeable."
           << endl;
   }
}

hash_multiset::hash_multiset

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

hash_multiset();

explicit hash_multiset(
    const Traits& Comp);

hash_multiset(
    const Traits& Comp,
    const Allocator& Al);

hash_multiset(
    const hash_multiset<Key, Traits, Allocator>& Right);

hash_multiset(
    hash_multiset&& Right
};
hash_multiset (initializer_list<Type> IList);

hash_multiset(
    initializer_list<Tu[e> IList, const Compare& Comp):
hash_multiset(
    initializer_list<Type> IList, const Compare& Comp, const Allocator& Al);

template <class InputIterator>
hash_multiset(
    InputIterator first,
    InputIterator last);

template <class InputIterator>
hash_multiset(
    InputIterator first,
    InputIterator last,
    const Traits& Comp);

template <class InputIterator>
hash_multiset(
    InputIterator first,
    InputIterator last,
    const Traits& Comp,
    const Allocator& Al);

Параметры

Аль
Класс распределителя памяти для использования с этим объектом hash_multiset. Значение по умолчанию — Allocator.

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

Right
hash_multiset, копией которого будет создаваемый hash_multiset.

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

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

IList
Список initializer_list с элементами, которые необходимо скопировать.

Замечания

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

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

Все конструкторы сохраняют объект-функцию типа Traits, которая используется для установления порядка ключей hash_multiset. Затем эту функцию можно получить с помощью вызова hash_multiset::key_comp. Более подробную информацию по Traits см. в разделе Класс hash_multiset.

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

Четвертый конструктор перемещает hash_multiset Right.

Пятый, шестой и седьмой конструкторы используют объект initializer_list.

Последние три конструктора копирую диапазон [ first, last) hash_multiset с увеличением точности при указании типа функции сравнения класса Compare и распределителя.

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

hash_multiset::insert

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Вставляет элемент или диапазон элементов в объект hash_multiset.

iterator insert(
    const Type& value);

iterator insert(
    iterator where,
    const Type& Al);

void insert(
    initializer_list<Type> IList);

iterator insert(
    const Type& value);

iterator insert(
    Iterator where,
    const Type& value);

template <class InputIterator>
void insert(
    InputIterator first,
    InputIterator last);

template <class ValTy>
iterator insert(
    ValTy&& value);

template <class ValTy>
iterator insert(
    const_iterator where,
    ValTy&& value);

Параметры

значение
Значение элемента, вставляемого в объект hash_multiset, кроме случая, когда объект hash_multiset уже содержит этот элемент, или, более общими словами, элемент, ключ которого эквивалентно упорядочен.

where
Место начала поиска правильной точки вставки. (Вставка может происходить в амортизированном времени константы, а не в логарифмическом времени, если точка вставки немедленно следует за местом.)

first
Положение первого элемента для копирования из объекта hash_multiset.

last
Положение сразу после последнего элемента для копирования из объекта hash_multiset.

IList
Объект initializer_list, содержащий элементы для копирования.

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

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

Следующие три функции-члена используют объект initializer_list.

Третья функция-член вставляет последовательность значений элементов в объект hash_multiset в соответствии с каждым элементом, адресованным итератором в диапазоне [ first, last) указанного объекта hash_multiset.

Замечания

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

hash_multiset::iterator

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename Traits::value_type, typename Traits::allocator_type>::iterator iterator;

Замечания

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

Пример

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

hash_multiset::key_comp

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

key_compare key_comp() const;

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

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

Дополнительные сведения о признаках см. в разделе о классе hash_multiset.

Замечания

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

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

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

Обратите внимание, что и key_compare, и value_compare — синонимы параметра-шаблона Traits. Оба типа предоставлены для классов hash_set и hash_multiset, где они идентичны, для совместимости с классами hash_map и hash_multimap, где они различаются.

Пример

// hash_multiset_key_comp.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;

   hash_multiset <int, hash_compare < int, less<int> > >hms1;
   hash_multiset<int, hash_compare < int, less<int> > >::key_compare kc1
          = hms1.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 hms1."
           << endl;
   }
   else
   {
      cout << "kc1( 2,3 ) returns value of false "
           << "where kc1 is the function object of hms1."
        << endl;
   }

   hash_multiset <int, hash_compare < int, greater<int> > > hms2;
   hash_multiset<int, hash_compare < int, greater<int> > >::key_compare
         kc2 = hms2.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 hms2."
           << endl;
   }
   else
   {
      cout << "kc2( 2,3 ) returns value of false, "
           << "where kc2 is the function object of hms2."
           << endl;
   }
}

hash_multiset::key_compare

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef Traits key_compare;

Замечания

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

Дополнительные сведения о признаках см. в разделе о классе hash_multiset.

Обратите внимание, что и key_compare, и value_compare — синонимы параметра-шаблона Traits. Оба типа предоставляются для классов hash_set и hash_multiset, где они идентичны, для совместимости с классами hash_map и hash_multimap, где они различаются.

Пример

См. пример для key_comp в качестве примера объявления и использования key_compare.

hash_multiset::key_type

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef Key key_type;

Замечания

key_typeявляется синонимом ключа параметра шаблона.

Обратите внимание, что и key_type, и value_type — синонимы для параметра-шаблона Key. Оба типа предоставляются для классов set и multiset, где они идентичны, для совместимости с классами map и multimap, где они различаются.

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

Пример

См. пример для value_type в качестве примера объявления и использования key_type.

hash_multiset::lower_bound

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_iterator lower_bound(const Key& key) const;

iterator lower_bound(const Key& key);

Параметры

key
Аргумент-ключ для сравнения с ключом сортировки элемента из объекта hash_multiset, в котором выполняется поиск.

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

Iterator или const_iterator, адресующий положение первого элемента объекта hash_multiset с ключом, который больше ключа-аргумента или равен ему, или адресующий положение после последнего элемента в hash_multiset, если соответствие для ключа не найдено.

Замечания

Пример

// hash_multiset_lower_bound.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main() {
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int> :: const_iterator hms1_AcIter, hms1_RcIter;

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

   hms1_RcIter = hms1.lower_bound( 20 );
   cout << "The element of hash_multiset hms1 with a key of 20 is: "
        << *hms1_RcIter << "." << endl;

   hms1_RcIter = hms1.lower_bound( 40 );

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

   // An element at a specific location in the hash_multiset can be found
   // by using a dereferenced iterator that addresses the location
   hms1_AcIter = hms1.end( );
   hms1_AcIter--;
   hms1_RcIter = hms1.lower_bound( *hms1_AcIter );
   cout << "The element of hms1 with a key matching "
        << "that of the last element is: "
        << *hms1_RcIter << "." << endl;
}

hash_multiset::max_size

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

size_type max_size() const;

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

Максимально возможная длина объекта hash_multiset.

Замечания

Пример

// hash_multiset_max_size.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int>::size_type i;

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

hash_multiset::operator=

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Заменяет элементы объекта hash_multiset копией другого объекта hash_multiset.

hash_multiset& operator=(const hash_multiset& right);

hash_multiset& operator=(hash_multiset&& right);

Параметры

right
Объект hash_multiset, копируемый в hash_multiset.

Замечания

После удаления существующих элементов в объекте hash_multisetкопирует operator= или перемещает содержимое вправоhash_multiset.

Пример

// hash_multiset_operator_as.cpp
// compile with: /EHsc
#include <hash_multiset>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset<int> v1, v2, v3;
   hash_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;
}

hash_multiset::p ointer

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename _Traits::value_type, typename _Traits::allocator_type>::pointer pointer;

Замечания

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

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

hash_multiset::rbegin

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_reverse_iterator rbegin() const;

reverse_iterator rbegin();

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

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

Замечания

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

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

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

Пример

// hash_multiset_rbegin.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int>::iterator hms1_Iter;
   hash_multiset <int>::reverse_iterator hms1_rIter;

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

   hms1_rIter = hms1.rbegin( );
   cout << "The first element in the reversed hash_multiset is "
        << *hms1_rIter << "." << endl;

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

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

   // A hash_multiset element can be erased by dereferencing to its key
   hms1_rIter = hms1.rbegin( );
   hms1.erase ( *hms1_rIter );

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

hash_multiset::reference

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename _Traits::value_type, typename _Traits::allocator_type>::reference reference;

Замечания

Пример

// hash_multiset_reference.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;

   hms1.insert( 10 );
   hms1.insert( 20 );

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

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

   // The value of the 1st element of the hash_multiset can be
   // changed by operating on its (non const) reference
   Ref1 = Ref1 + 5;

   cout << "The first element in the hash_multiset is now "
        << *hms1.begin() << "." << endl;
}
The first element in the hash_multiset is 10.
The first element in the hash_multiset is now 15.

hash_multiset::rend

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_reverse_iterator rend() const;

reverse_iterator rend();

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

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

Замечания

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

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

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

Пример

// hash_multiset_rend.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int>::iterator hms1_Iter;
   hash_multiset <int>::reverse_iterator hms1_rIter;
   hash_multiset <int>::const_reverse_iterator hms1_crIter;

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

   hms1_rIter = hms1.rend( );
   hms1_rIter--;
   cout << "The last element in the reversed hash_multiset is "
        << *hms1_rIter << "." << endl;

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

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

   hms1_rIter = hms1.rend( );
   hms1_rIter--;
   hms1.erase ( *hms1_rIter );

   hms1_rIter = hms1.rend( );
   hms1_rIter--;
   cout << "After the erasure, the last element in the "
        << "reversed hash_multiset is " << *hms1_rIter << "."
        << endl;
}
The last element in the reversed hash_multiset is 10.
The hash_multiset is: 10 20 30 .
The reversed hash_multiset is: 30 20 10 .
After the erasure, the last element in the reversed hash_multiset is 20.

hash_multiset::reverse_iterator

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef list<typename Traits::value_type, typename Traits::allocator_type>::reverse_iterator reverse_iterator;

Замечания

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

Пример

См. пример для rbegin в качестве примера объявления и использования reverse_iterator.

hash_multiset::size

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Возвращает количество элементов в объекте hash_multiset.

size_type size() const;

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

Текущая длина объекта hash_multiset.

Замечания

Пример

// hash_multiset_size.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int> :: size_type i;

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

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

hash_multiset::size_type

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Беззнаковый целочисленный тип, который может представлять количество элементов в объекте hash_multiset.

typedef list<typename _Traits::value_type, typename _Traits::allocator_type>::size_type size_type;

Замечания

Пример

См. пример для size в качестве примера объявления и использования size_type

hash_multiset::swap

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

Обменивает местами элементы двух объектов hash_multiset.

void swap(hash_multiset& right);

Параметры

right
Аргумент-объект hash_multiset, предоставляющий элементы, которые должны быть обменены местами с элементами целевого объектаhash_multiset.

Замечания

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

Пример

// hash_multiset_swap.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1, hms2, hms3;
   hash_multiset <int>::iterator hms1_Iter;

   hms1.insert( 10 );
   hms1.insert( 20 );
   hms1.insert( 30 );
   hms2.insert( 100 );
   hms2.insert( 200 );
   hms3.insert( 300 );

   cout << "The original hash_multiset hms1 is:";
   for ( hms1_Iter = hms1.begin( ); hms1_Iter != hms1.end( );
         hms1_Iter++ )
         cout << " " << *hms1_Iter;
   cout   << "." << endl;

   // This is the member function version of swap
   hms1.swap( hms2 );

   cout << "After swapping with hms2, list hms1 is:";
   for ( hms1_Iter = hms1.begin( ); hms1_Iter != hms1.end( );
         hms1_Iter++ )
         cout << " " << *hms1_Iter;
   cout  << "." << endl;

   // This is the specialized template version of swap
   swap( hms1, hms3 );

   cout << "After swapping with hms3, list hms1 is:";
   for ( hms1_Iter = hms1.begin( ); hms1_Iter != hms1.end( );
         hms1_Iter++ )
         cout << " " << *hms1_Iter;
   cout   << "." << endl;
}
The original hash_multiset hms1 is: 10 20 30.
After swapping with hms2, list hms1 is: 200 100.
After swapping with hms3, list hms1 is: 300.

hash_multiset::upper_bound

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

const_iterator upper_bound(const Key& key) const;

iterator upper_bound(const Key& key);

Параметры

key
Аргумент-ключ для сравнения с ключом сортировки элемента из объекта hash_multiset, в котором выполняется поиск.

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

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

Замечания

Пример

// hash_multiset_upper_bound.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int> :: const_iterator hms1_AcIter, hms1_RcIter;

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

   hms1_RcIter = hms1.upper_bound( 20 );
   cout << "The first element of hash_multiset hms1" << endl
        << "with a key greater than 20 is: "
        << *hms1_RcIter << "." << endl;

   hms1_RcIter = hms1.upper_bound( 30 );

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

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

hash_multiset::value_comp

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

value_compare value_comp() const;

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

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

Дополнительные сведения о признаках см. в разделе о классе hash_multiset.

Замечания

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

оператор bool ( constKey&_xVal, const Key& _yVal);

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

Обратите внимание, что и key_compare, и value_compare — синонимы параметра-шаблона Traits. Оба типа предоставлены для классов hash_set и hash_multiset, где они идентичны, для совместимости с классами hash_map и hash_multimap, где они различаются.

Пример

// hash_multiset_value_comp.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;

   hash_multiset <int, hash_compare < int, less<int> > > hms1;
   hash_multiset <int, hash_compare < int, less<int> > >::value_compare
      vc1 = hms1.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 hms1."
           << endl;
   }
   else
   {
      cout << "vc1( 2,3 ) returns value of false, "
           << "where vc1 is the function object of hms1."
           << endl;
   }

   hash_multiset <int, hash_compare < int, greater<int> > > hms2;
   hash_multiset<int, hash_compare < int, greater<int> > >::
           value_compare vc2 = hms2.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 hms2."
           << endl;
   }
   else
   {
      cout << "vc2( 2,3 ) returns value of false, "
           << "where vc2 is the function object of hms2."
           << endl;
   }
}
vc1( 2,3 ) returns value of true, where vc1 is the function object of hms1.
vc2( 2,3 ) returns value of false, where vc2 is the function object of hms2.

hash_multiset::value_compare

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef key_compare value_compare;

Замечания

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

Дополнительные сведения о признаках см. в разделе о классе hash_multiset.

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

Пример

См. пример для value_comp в качестве примера объявления и использования value_compare.

hash_multiset::value_type

Примечание.

Этот элемент API устарел. Альтернатива — класс unordered_multiset.

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

typedef Key value_type;

Пример

// hash_multiset_value_type.cpp
// compile with: /EHsc
#include <hash_set>
#include <iostream>

int main( )
{
   using namespace std;
   using namespace stdext;
   hash_multiset <int> hms1;
   hash_multiset <int>::iterator hms1_Iter;

   // Declare value_type
   hash_multiset <int> :: value_type hmsvt_Int;

   hmsvt_Int = 10;   // Initialize value_type

   // Declare key_type
   hash_multiset <int> :: key_type hmskt_Int;
   hmskt_Int = 20;             // Initialize key_type

   hms1.insert( hmsvt_Int );         // Insert value into s1
   hms1.insert( hmskt_Int );         // Insert key into s1

   // A hash_multiset accepts key_types or value_types as elements
   cout << "The hash_multiset has elements:";
   for ( hms1_Iter = hms1.begin() ; hms1_Iter != hms1.end( );
         hms1_Iter++)
      cout << " " << *hms1_Iter;
      cout << "." << endl;
}
The hash_multiset has elements: 10 20.

См. также

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