multiset Klasa

Klasa wielozestawowa biblioteki standardowej języka C++ jest używana do przechowywania i pobierania danych z kolekcji, w której wartości zawartych elementów nie muszą być unikatowe i w których służą jako wartości klucza, zgodnie z którymi dane są automatycznie uporządkowane. Wartość klucza elementu w obiekcie multiset może nie zostać zmieniona bezpośrednio. Zamiast tego trzeba usunąć stare wartości i wstawić elementy z nowymi wartościami.

Składnia

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

Parametry

Key
Typ danych elementu, który ma być przechowywany w obiekcie multiset.

Compare
Typ, który udostępnia obiekt funkcji, który może porównać dwie wartości elementu jako klucze sortowania, aby określić ich względną kolejność w obiekcie multiset. Predykat binarny mniejszego<klucza> jest wartością domyślną.

W języku C++14 można włączyć heterogeniczne wyszukiwanie, określając std::less<> predykat lub std::greater<> bez parametrów typu. Aby uzyskać więcej informacji, zobacz Heterogeniczne wyszukiwanie w kontenerach asocjacyjnych.

Allocator
Typ reprezentujący przechowywany obiekt alokatora, który hermetyzuje szczegóły dotyczące multisetalokacji i cofania przydziału pamięci. Domyślna wartość to allocator<Key>.

Uwagi

Klasa standardowej biblioteki multiset języka C++ to:

  • Kontener asocjacyjny, który jest kontenerem o zmiennym rozmiarze, obsługującym efektywne pobieranie wartości elementu w oparciu o wartość skojarzonego klucza.

  • Odwracalny, ponieważ zapewnia dwukierunkowe iteratory do dostępu do jego elementów.

  • Posortowany, ponieważ jego elementy są uporządkowane według wartości kluczy w kontenerze zgodnie z określoną funkcją porównywania.

  • Wiele w tym sensie, że jego elementy nie muszą mieć unikatowych kluczy, dzięki czemu jedna wartość klucza może mieć wiele skojarzonych wartości elementów.

  • Prosty kontener asocjacyjny, ponieważ jego wartości elementu są jego wartościami klucza.

  • Szablon klasy, ponieważ zapewniane funkcje są ogólne i tak niezależne od określonego typu danych zawartych jako elementy. Typ danych, który ma być użyty, jest zamiast tego określony jako parametr w klasie szablonu wraz z funkcją porównania i alokatorem.

Iterator dostarczany przez multiset klasę jest iteratorem dwukierunkowym, ale funkcje insert składowe klasy i multiset mają wersje, które przyjmują jako parametry szablonu słabszy iterator wejściowy, którego wymagania dotyczące funkcjonalności są bardziej minimalne niż te gwarantowane przez klasę iteratorów dwukierunkowych. Pojęcia innych iteratorów formują rodzinę powiązaną przez udoskonalenia w ich funkcjonalnościach. Każde pojęcie iteratora ma swój własny zestaw wymagań, a algorytmy z nimi pracujące muszą ograniczać swoje założenia co do wymagań dostarczonych przez tego typu iterator. Można założyć, że z iteratora danych wejściowych można usunąć odwołanie, aby odwołać się do obiektu, a także, że może on być zwiększony do następnego iteratora w sekwencji. Jest to minimalny zestaw funkcji, ale wystarczy, aby móc mówić znacząco o zakresie iteratorów [ First, Last) w kontekście funkcji składowych klasy.

Wybór typu kontenera powinien ogólnie być oparty o typ wyszukiwania i wstawiania wymagany przez aplikację. Kontenery asocjacyjne są zoptymalizowane dla operacji wyszukiwania, wstawiania i usuwania. Funkcje składowe, które jawnie obsługują te operacje, są wydajne, wykonując je w czasie, który jest średnio proporcjonalny do logarytmu liczby elementów w kontenerze. Wstawianie elementów powoduje unieważnienie żadnych iteratorów i usunięcie elementów unieważnia tylko te iteratory, które wskazywały na usunięte elementy.

Element multiset powinien być wybranym kontenerem asocjacyjnym, gdy warunki kojarzenia wartości z kluczami są spełnione przez aplikację. Elementy elementu multiset mogą być wielokrotne i służyć jako własne klucze sortowania, więc klucze nie są unikatowe. Model dla tego typu konstrukcji jest uporządkowaną listą, np. wyrazów, w których wyrazy mogą występować więcej niż jeden raz. Gdyby nie zezwolono na wiele wystąpień wyrazów, odpowiednią strukturą kontenera byłby zestaw. Gdyby unikatowe definicje zostały dołączone jako wartości do listy unikatowych słów kluczowych, mapa byłaby odpowiednią strukturą zawierającą te dane. Gdyby zamiast tego definicje nie były unikatowe, byłby to multimap wybrany kontener.

Kolejność multiset steruje sekwencją przez wywołanie przechowywanego obiektu funkcji typu Compare. Ten przechowywany obiekt jest funkcją porównania, która może być dostępna przez wywołanie funkcji key_compskładowej . Ogólnie rzecz biorąc, elementy muszą być jedynie mniej niż porównywalne do ustalenia tej kolejności: tak aby, biorąc pod uwagę dwa elementy, można określić, że są one równoważne (w sensie, że ani nie jest mniejszy niż drugi) lub że jeden jest mniejszy niż drugi. Skutkuje to ustaleniem kolejności dla elementów nierównoważnych. Ze strony bardziej technicznej, funkcja porównywania jest predykatem binarnym, który wymusza ścisłe słabe porządkowanie w standardowym sensie matematycznym. Predykat binarny f(x, y) to obiekt funkcji, który ma dwa obiekty argumentów x i y oraz zwracaną wartość true lub false. Kolejność nałożona na zestaw to ścisłe słabe porządkowanie, jeśli predykat binarny jest nieelastycznym, antysymetrycznym i przechodniym, a jeśli równoważność jest przechodnia, gdzie dwa obiekty x i y są definiowane jako równoważne, gdy oba obiekty f(x,y) i f(y,x) są fałszywe. Jeśli silniejszy warunek równości pomiędzy kluczami zastąpi ten równoważności, to porządkowanie będzie całkowite (w sensie, że wszystkie elementy są uporządkowane względem siebie), a dopasowane klucze będą od siebie nieodróżnialne.

W języku C++14 można włączyć heterogeniczne wyszukiwanie, określając std::less<> predykat lub std::greater<> bez parametrów typu. Aby uzyskać więcej informacji, zobacz Heterogeniczne wyszukiwanie w kontenerach asocjacyjnych.

Konstruktory

Konstruktor opis
Zestaw wielokrotny Tworzy obiekt multiset , który jest pusty lub jest kopią wszystkich lub części określonego multisetelementu .

Typedefs

Nazwa typu opis
allocator_type Definicja typu dla allocator klasy dla multiset obiektu.
const_iterator Definicja typu dla iteratora dwukierunkowego, który może odczytać const element w obiekcie multiset.
const_pointer Definicja typu wskaźnika do const elementu w elemecie multiset.
const_reference Definicja typu dla odwołania do elementu przechowywanego const w multiset obiekcie do odczytu i wykonywania const operacji.
const_reverse_iterator Definicja typu dla iteratora dwukierunkowego, który może odczytywać dowolny const element w obiekcie multiset.
difference_type Liczba całkowita ze znakiemdef dla liczby elementów w zakresie między elementami multiset wskazywanym przez iteratory.
iterator Definicja typu dla iteratora dwukierunkowego, który może odczytywać lub modyfikować dowolny element w obiekcie multiset.
key_compare Definicja typedef dla obiektu funkcji, który może porównać dwa klucze, aby określić względną kolejność dwóch elementów w obiekcie multiset.
key_type Definicja typu dla obiektu funkcji, który może porównać dwa klucze sortowania, aby określić względną kolejność dwóch elementów w obiekcie multiset.
pointer Definicja typu wskaźnika do elementu w elemecie multiset.
reference Definicja typu dla odwołania do elementu przechowywanego w elemencie multiset.
reverse_iterator Definicja typu dla iteratora dwukierunkowego, który może odczytywać lub modyfikować element w odwróconym multisetobiekcie .
size_type Niepodpisany typ liczb całkowitych, który może reprezentować liczbę elementów w obiekcie multiset.
value_compare Definicja typedef dla obiektu funkcji, który może porównać dwa elementy jako klucze sortowania, aby określić ich względną kolejność w obiekcie multiset.
value_type Definicja typu, która opisuje obiekt przechowywany jako element jako multiset element w jego pojemności jako wartość.

Funkcje składowe

Funkcja składowa opis
begin Zwraca iterator wskazujący pierwszy element w elemecie multiset.
cbegin Zwraca iterator const, który adresuje pierwszy element w elemecie multiset.
cend Zwraca iterator const, który adresuje lokalizację, która zakończyła się powodzeniem ostatniego elementu w elemecie multiset.
clear Usuwa wszystkie elementy elementu multiset.
containsC++20 Sprawdź, czy w elemecie znajduje się element z określonym kluczem multiset.
count Zwraca liczbę elementów w multiset obiekcie, których klucz pasuje do klucza określonego jako parametr.
crbegin Zwraca iterator const odnoszący się do pierwszego elementu w odwróconym multisetobiekcie .
crend Zwraca iterator const, który adresuje lokalizację, która zakończyła się powodzeniem ostatniego elementu w odwróconym elemecie multiset.
emplace Wstawia element skonstruowany w miejscu do elementu multiset.
emplace_hint Wstawia element skonstruowany w miejscu do multisetelementu z wskazówką umieszczania.
empty Sprawdza, czy element multiset jest pusty.
end Zwraca iterator wskazujący lokalizację po ostatnim elemecie w elemecie multiset.
equal_range Zwraca parę iteratorów. Pierwszy iterator w parze wskazuje pierwszy element w obiekcie multiset z kluczem większym niż określony klucz. Drugi iterator w parze wskazuje pierwszy element w multiset obiekcie z kluczem równym lub większym niż klucz.
erase Usuwa element lub zakres elementów z multiset określonych pozycji lub usuwa elementy zgodne z określonym kluczem.
find Zwraca iterator wskazujący pierwszą lokalizację elementu w obiekcie multiset , który ma klucz równy określonemu kluczowi.
get_allocator Zwraca kopię allocator obiektu, który jest używany do konstruowania obiektu multiset.
insert Wstawia element lub zakres elementów do elementu multiset.
key_comp Udostępnia obiekt funkcji, który może porównać dwa klucze sortowania w celu określenia względnej kolejności dwóch elementów w obiekcie multiset.
lower_bound Zwraca iterator do pierwszego elementu w obiekcie multiset z kluczem równym lub większym niż określony klucz.
max_size Zwraca maksymalną długość obiektu multiset.
rbegin Zwraca iterator wskazujący pierwszy element w odwróconym multisetobiekcie .
rend Zwraca iterator wskazujący lokalizację, która zakończyła się powodzeniem ostatniego elementu w odwróconym elemecie multiset.
size Zwraca liczbę elementów w obiekcie multiset.
swap Wymienia elementy dwóch multisets.
upper_bound Zwraca iterator do pierwszego elementu w obiekcie multiset z kluczem większym niż określony klucz.
value_comp Pobiera kopię obiektu porównania, który jest używany do porządkowenia wartości elementów w obiekcie multiset.

Operatory

Operator opis
operator= Zastępuje elementy elementu multiset kopią innego multisetelementu .

Wymagania

Nagłówka:<set>

Obszaru nazw:std

multiset::allocator_type

Typ reprezentujący klasę alokatora multiset dla obiektu

typedef Allocator allocator_type;

Uwagi

allocator_type jest synonimem parametru Allocatorszablonu .

Aby uzyskać więcej informacji na temat Allocator, zobacz sekcję Uwagi w temacie Klasa wielozestawowa.

Przykład

Zobacz przykład, aby get_allocator zapoznać się z przykładem użycia allocator_type

multiset::begin

Zwraca iterator odnoszący się do pierwszego elementu w elemecie multiset.

const_iterator begin() const;

iterator begin();

Wartość zwracana

Iterator dwukierunkowy odnoszący się do pierwszego elementu w multiset lokalizacji lub, który zakończył się powodzeniem pustego wielozestawu.

Przykład

// 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 Zwraca iterator, który adresuje pierwszy element w zakresie.

const_iterator cbegin() const;

Wartość zwracana

const Iterator dostępu dwukierunkowego, który wskazuje pierwszy element zakresu lub lokalizację tuż poza końcem pustego zakresu (dla pustego zakresu, cbegin() == cend()).

Uwagi

Przy zwracanej wartości cbeginelementu nie można modyfikować elementów w zakresie.

Możesz użyć tej funkcji składowej zamiast funkcji składowej begin() , aby zagwarantować, że zwracana wartość to const_iterator. Zazwyczaj jest używany w połączeniu ze słowem kluczowym potrącenia typu automatycznego , jak pokazano w poniższym przykładzie. W tym przykładzie rozważmy Container , aby być kontenerem modyfikowalnym (innym niż const) jakiegokolwiek rodzaju, który obsługuje begin() i cbegin().

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

// i2 is Container<T>::const_iterator

multiset::cend

Zwraca iterator, który adresuje lokalizację const tuż poza ostatnim elementem w zakresie.

const_iterator cend() const;

Wartość zwracana

const Iterator dostępu dwukierunkowego, który wskazuje tuż poza końcem zakresu.

Uwagi

cend służy do testowania, czy iterator przeszedł koniec jego zakresu.

Możesz użyć tej funkcji składowej zamiast funkcji składowej end() , aby zagwarantować, że zwracana wartość to const_iterator. Zazwyczaj jest używany w połączeniu ze słowem kluczowym potrącenia typu automatycznego , jak pokazano w poniższym przykładzie. W tym przykładzie rozważmy Container , aby być kontenerem modyfikowalnym (innym niż const) jakiegokolwiek rodzaju, który obsługuje end() i cend().

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

// i2 is Container<T>::const_iterator

Wartość zwracana przez cend nie powinna być wyłuszczone.

multiset::clear

Usuwa wszystkie elementy elementu multiset.

void clear();

Przykład

// 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

Typ, który udostępnia iterator dwukierunkowy, który może odczytać const element w obiekcie multiset.

typedef implementation-defined const_iterator;

Uwagi

Nie można użyć typu const_iterator do modyfikowania wartości elementu.

Przykład

Zobacz przykład, aby begin zapoznać się z przykładem przy użyciu polecenia const_iterator.

multiset::const_pointer

Typ, który dostarcza wskaźnik do const elementu w obiekcie multiset.

typedef typename allocator_type::const_pointer const_pointer;

Uwagi

Nie można użyć typu const_pointer do modyfikowania wartości elementu.

W większości przypadków iterator powinien być używany do uzyskiwania dostępu do elementów w multiset obiekcie.

multiset::const_reference

Typ, który zawiera odwołanie do elementu przechowywanego const w multiset obiekcie do odczytu i wykonywania const operacji.

typedef typename allocator_type::const_reference const_reference;

Przykład

// 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

Typ, który udostępnia iterator dwukierunkowy, który może odczytywać dowolny const element w obiekcie multiset.

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

Uwagi

Typ const_reverse_iterator nie może modyfikować wartości elementu i jest używany do iterowania w odwrotnej multiset części.

Przykład

Zobacz przykład, aby zapoznać się z przykładem rend deklarowania i używania elementu const_reverse_iterator.

multiset::contains

Sprawdź, czy w elemecie znajduje się element z określonym kluczem multiset.

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

Parametry

K
Typ klucza.

key
Wartość klucza elementu do wyszukania.

Wartość zwracana

true jeśli element zostanie znaleziony w kontenerze; false Inaczej.

Uwagi

contains() jest nowy w języku C++20. Aby go użyć, określ /std:c++20 lub nowszą opcję kompilatora.

template<class K> bool contains(const K& key) const Uczestniczy tylko w rozwiązywaniu przeciążeń, jeśli key_compare jest przezroczysty. Aby uzyskać więcej informacji, zobacz Heterogeniczne wyszukiwanie w kontenerach asocjacyjnych.

Przykład

// 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

Zwraca liczbę elementów w kluczu multiset , których klucz pasuje do klucza określonego parametrem.

size_type count(const Key& key) const;

Parametry

key
Klucz elementów do dopasowania z elementu multiset.

Wartość zwracana

Liczba elementów w kluczu multiset sortowania, których klucz sortowania jest zgodny z kluczem parametru.

Uwagi

Funkcja składowa zwraca liczbę elementów x w zakresie

[ lower_bound(key), upper_bound(key) )

Przykład

W poniższym przykładzie pokazano użycie funkcji składowej 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

Zwraca iterator const odnoszący się do pierwszego elementu w odwróconym wielozestawie.

const_reverse_iterator crbegin() const;

Wartość zwracana

Odwrotny iterator dwukierunkowy odnoszący się do pierwszego elementu w odwróconym wielozestawie lub adresowaniu, który był ostatnim elementem w niewrócenym wielozestawie.

Uwagi

crbeginjest używany z odwróconym wielozestawem tak samo jak początek jest używany z .multiset

Przy użyciu wartości zwracanej crbeginmultiset obiektu nie można modyfikować.

crbegin może służyć do iterowania przez multiset tyły.

Przykład

// 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

Zwraca iterator const, który odnosi się do lokalizacji, która zakończyła się powodzeniem ostatniego elementu w odwróconym wielozestawie.

const_reverse_iterator crend() const;

Wartość zwracana

Odwrotny iterator dwukierunkowy, który adresuje lokalizację, która zakończyła się powodzeniem ostatniego elementu w odwróconym wielozestawie (lokalizacja, która poprzedzała pierwszy element w niewróconym wielozestawie).

Uwagi

crend jest używany z odwróconym wielozestawem tak samo, jak end w przypadku elementu multiset.

Przy użyciu wartości zwracanej crendmultiset obiektu nie można modyfikować.

crend można użyć do sprawdzenia, czy iterator odwrotny osiągnął koniec jego multiset.

Wartość zwracana przez crend nie powinna być wyłuszczone.

Przykład

// 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

Typ liczby całkowitej ze znakiem, który może służyć do reprezentowania liczby elementów multiset w zakresie między elementami wskazywanym przez iteratory.

typedef typename allocator_type::difference_type difference_type;

Uwagi

Jest difference_type to typ zwracany podczas odejmowania lub przyrostowania przez iteratory kontenera. Element difference_type jest zwykle używany do reprezentowania liczby elementów w zakresie [ first, last) między iteratorami first i last, zawiera element wskazywany przez first i zakres elementów do, ale nie uwzględnia, element wskazywany przez last.

Mimo difference_type że jest dostępny dla wszystkich iteratorów spełniających wymagania iteratora wejściowego, który obejmuje klasę iteratorów dwukierunkowych obsługiwanych przez kontenery odwracalne, takie jak zestaw, odejmowanie między iteratorami jest obsługiwane tylko przez iteratory dostępu losowego udostępniane przez wektor podobny do losowego dostępu.

Przykład

// 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

Wstawia element skonstruowany na miejscu (nie są wykonywane żadne operacje kopiowania lub przenoszenia) z wskazówką umieszczania.

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

Parametry

args
Argumenty przekazane w celu skonstruowania elementu, który ma zostać wstawiony do elementu multiset.

Wartość zwracana

Iterator nowo wstawiony element.

Uwagi

Żadne odwołania do elementów kontenera nie są unieważniane przez tę funkcję, ale może unieważnić wszystkie iteratory do kontenera.

W przypadku zgłoszenia wyjątku stan kontenera nie jest modyfikowany podczas zastępowania.

Przykład

// 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

Wstawia element skonstruowany na miejscu (nie są wykonywane żadne operacje kopiowania lub przenoszenia) z wskazówką umieszczania.

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

Parametry

args
Argumenty przekazane w celu skonstruowania elementu, który ma zostać wstawiony do elementu multiset.

where
Miejsce, w którym należy rozpocząć wyszukiwanie poprawnego punktu wstawiania. (Jeśli ten punkt bezpośrednio poprzedza where, wstawienie może wystąpić w amortyzowanym czasie stałym zamiast czasu logarytmicznych).

Wartość zwracana

Iterator nowo wstawiony element.

Uwagi

Żadne odwołania do elementów kontenera nie są unieważniane przez tę funkcję, ale może unieważnić wszystkie iteratory do kontenera.

W przypadku zgłoszenia wyjątku stan kontenera nie jest modyfikowany podczas zastępowania.

Aby zapoznać się z przykładem kodu, zobacz set::emplace_hint.

multiset::empty

Sprawdza, czy element multiset jest pusty.

bool empty() const;

Wartość zwracana

true jeśli wartość jest pusta multiset ; false jeśli wartość jest pusta multiset .

Przykład

// 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

Zwraca iterator poza końcem.

const_iterator end() const;

iterator end();

Wartość zwracana

Iterator przeszłości. Jeśli wartość jest pusta multiset , to multiset::end() == multiset::begin().

Uwagi

end służy do testowania, czy iterator przeszedł koniec jego wielu zestawów.

Wartość zwracana przez end nie powinna być wyłuszczone.

Aby zapoznać się z przykładem kodu, zobacz multiset::find.

multiset::equal_range

Zwraca parę iteratorów odpowiednio do pierwszego elementu w multiset obiekcie z kluczem większym niż określony klucz i do pierwszego elementu w multiset obiekcie z kluczem równym lub większym niż klucz.

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

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

Parametry

key
Klucz argumentu do porównania z kluczem sortowania elementu z multiset przeszukiwanego elementu.

Wartość zwracana

Para iteratorów tak, że pierwszy jest lower_bound kluczem, a drugi jest upper_bound kluczem.

Aby uzyskać dostęp do pierwszego iteratora pary pr zwróconej przez funkcję składową, użyj polecenia pr. first, i aby wyłusić iterator dolnej granicy, użyj *( pr. first). Aby uzyskać dostęp do drugiego iteratora pary pr zwróconej przez funkcję składową, użyj polecenia pr. second, i aby wyłuskać iterator górnej granicy, użyj *( pr. second).

Przykład

// 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

Usuwa element lub zakres elementów z multiset określonych pozycji lub usuwa elementy zgodne z określonym kluczem.

iterator erase(
    const_iterator Where);

iterator erase(
    const_iterator First,
    const_iterator Last);

size_type erase(
    const key_type& Key);

Parametry

Where
Położenie elementu do usunięcia.

First
Pozycja pierwszego elementu do usunięcia.

Last
Pozycja tuż poza ostatnim elementem, który ma zostać usunięty.

key
Wartość klucza elementów do usunięcia.

Wartość zwracana

W przypadku dwóch pierwszych funkcji składowych iterator dwukierunkowy, który wyznacza pierwszy element pozostały poza usuniętymi elementami lub element, który jest końcem multiset elementu , jeśli taki element nie istnieje.

W przypadku trzeciej funkcji składowej zwraca liczbę elementów, które zostały usunięte z klasy multiset.

Uwagi

Aby zapoznać się z przykładem kodu, zobacz set::erase.

multiset::find

Zwraca iterator odwołujący się do lokalizacji elementu w obiekcie multiset , który ma klucz odpowiadający określonemu kluczowi.

iterator find(const Key& key);

const_iterator find(const Key& key) const;

Parametry

key
Wartość klucza, która ma być dopasowywana przez klucz sortowania elementu z przeszukiwanego multiset elementu.

Wartość zwracana

Iterator odwołujący się do lokalizacji elementu z określonym kluczem lub lokalizacji, która zakończyła się powodzeniem ostatniego elementu w multiset obiekcie ( multiset::end()), jeśli nie zostanie znalezione dopasowanie klucza.

Uwagi

Funkcja składowa zwraca iterator, który odwołuje się do elementu w kluczu multiset , którego klucz jest odpowiednikiem argumentu key w predykacie binarnym, który wywołuje kolejność na podstawie relacji mniejszej niż porównywalność.

Jeśli zwracana wartość find elementu jest przypisana do const_iteratorobiektu , multiset nie można zmodyfikować obiektu. Jeśli zwracana wartość find elementu jest przypisana do iteratorobiektu , multiset można go zmodyfikować

Przykład

// 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

Zwraca kopię obiektu alokatora używanego do konstruowania obiektu multiset.

allocator_type get_allocator() const;

Wartość zwracana

Alokator używany przez element multiset.

Uwagi

Alokatory dla multiset klasy określają sposób zarządzania magazynem przez klasę. Domyślne alokatory dostarczane z klasami kontenerów biblioteki standardowej języka C++ są wystarczające dla większości potrzeb programistycznych. Pisanie i używanie własnej klasy alokatora jest zaawansowanym tematem języka C++.

Przykład

// 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

Wstawia element lub zakres elementów do elementu 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);

Parametry

Val
Wartość elementu, który ma zostać wstawiony do elementu multiset.

Where
Miejsce, w którym należy rozpocząć wyszukiwanie poprawnego punktu wstawiania. (Jeśli ten punkt bezpośrednio poprzedza Where, wstawienie może wystąpić w amortyzowanym czasie stałym zamiast czasu logarytmicznych).

ValTy
Parametr szablonu określający typ argumentu, który multiset może służyć do konstruowania elementu value_type, i perfect-forwards Val jako argumentu.

First
Położenie pierwszego elementu do skopiowania.

Last
Pozycja tuż poza ostatnim elementem do skopiowania.

1
Argument funkcji szablonu, który spełnia wymagania elementu input_iterator_tag wskazującego elementy typu, który może służyć do konstruowania 1 obiektów.

IList
Element initializer_list , z którego mają być skopiowane elementy.

Wartość zwracana

Funkcje składowe z jednym elementem, (1) i (2) zwracają iterator do pozycji, w której nowy element został wstawiony do multisetelementu .

Funkcje składowe single-element-with-hint( 3) i (4) zwracają iterator wskazujący położenie, w którym nowy element został wstawiony do multisetelementu .

Uwagi

Ta funkcja nie unieważnia wskaźników ani odwołań, ale może unieważnić wszystkie iteratory do kontenera.

Podczas wstawiania tylko jednego elementu, jeśli zgłaszany jest wyjątek, stan kontenera nie jest modyfikowany. Podczas wstawiania wielu elementów, jeśli zostanie zgłoszony wyjątek, kontener pozostanie w nieokreślonym, ale prawidłowym stanie.

Kontener value_type jest typedef, który należy do kontenera, a dla zestawu multiset<V>::value_type jest typem const V.

Funkcja składowa zakresu (5) wstawia sekwencję wartości elementów do multiset elementu odpowiadającego każdemu elementowi adresowanemu przez iterator w zakresie [First, Last); w związku z tym Last nie zostanie wstawiona. Funkcja end() składowa kontenera odwołuje się do pozycji tuż po ostatnim elemencie w kontenerze — na przykład instrukcja s.insert(v.begin(), v.end()); wstawia wszystkie elementy v do selementu .

Funkcja składowa listy inicjatora (6) używa elementu initializer_list do kopiowania elementów do elementu multiset.

W przypadku wstawiania elementu skonstruowanego na miejscu — czyli nie są wykonywane żadne operacje kopiowania lub przenoszenia — zobacz multiset::emplace i multiset::emplace_hint.

Przykład

// 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

Typ, który udostępnia stały iterator dwukierunkowy, który może odczytywać dowolny element w obiekcie multiset.

typedef implementation-defined iterator;

Przykład

Zobacz przykład, aby zapoznać się z przykładem sposobu deklarowania i używania elementu iterator.

multiset::key_comp

Pobiera kopię obiektu porównania używanego do zamawiania kluczy w obiekcie multiset.

key_compare key_comp() const;

Wartość zwracana

Zwraca obiekt funkcji używany multiset do zamawiania jego elementów, który jest parametrem Compareszablonu .

Aby uzyskać więcej informacji na temat Compare, zobacz sekcję Uwagi w temacie Klasa wielozestawowa.

Uwagi

Przechowywany obiekt definiuje funkcję składową:

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

zwraca wartość true, jeśli x ściśle poprzedza wartość y w kolejności sortowania.

Oba key_compare parametry i value_compare są synonimami parametru Compareszablonu . Oba typy są udostępniane dla zestawu klas i wielu zestawów, gdzie są identyczne, w celu zapewnienia zgodności z mapą klas i wielomapą, gdzie są one odrębne.

Przykład

// 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

Typ, który udostępnia obiekt funkcji, który może porównać dwa klucze sortowania, aby określić względną kolejność dwóch elementów w obiekcie multiset.

typedef Compare key_compare;

Uwagi

key_compare jest synonimem parametru Compareszablonu .

Aby uzyskać więcej informacji na temat Compare, zobacz sekcję multiset Uwagi w temacie Klasa .

Przykład

Zobacz przykład, aby zapoznać się z przykładem key_comp sposobu deklarowania i używania elementu key_compare.

multiset::key_type

Typ udostępniający obiekt funkcji, który może porównać klucze sortowania w celu określenia względnej kolejności dwóch elementów w obiekcie multiset.

typedef Key key_type;

Uwagi

key_type jest synonimem parametru Keyszablonu .

Aby uzyskać więcej informacji na temat Key, zobacz sekcję multiset Uwagi w temacie Klasa .

Przykład

Zobacz przykład, aby zapoznać się z przykładem value_type sposobu deklarowania i używania elementu key_type.

multiset::lower_bound

Zwraca iterator do pierwszego elementu w obiekcie multiset z kluczem równym lub większym niż określony klucz.

const_iterator lower_bound(const Key& key) const;

iterator lower_bound(const Key& key);

Parametry

key
Klucz argumentu do porównania z kluczem sortowania elementu z multiset przeszukiwanego elementu.

Wartość zwracana

Element iterator lub const_iterator adresujący lokalizację elementu w multiset obiekcie z kluczem równym lub większym niż klucz argumentu albo adresuje lokalizację, która zakończyła się powodzeniem ostatniego elementu w obiekcie , multiset jeśli nie znaleziono dopasowania klucza.

Przykład

// 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

Zwraca maksymalną długość obiektu multiset.

size_type max_size() const;

Wartość zwracana

Maksymalna możliwa długość obiektu multiset.

Przykład

// 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

Tworzy element, który multiset jest pusty lub jest kopią wszystkich lub części innych multisetelementów .

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);

Parametry

Al
Klasa alokatora magazynu, która ma być używana dla tego obiektu wielozestawowego, który domyślnie ma wartość Allocator.

Comp
Funkcja porównania typu const Compare używana do porządkowenia elementów w multisetobiekcie , która jest domyślnie ustawiona na Compare.

Right
multiset element, z którego skonstruowany wielozestaw ma być kopią.

First
Położenie pierwszego elementu w zakresie elementów do skopiowania.

Last
Położenie pierwszego elementu poza zakresem elementów do skopiowania.

IList
Element initializer_list , z którego mają być skopiowane elementy.

Uwagi

Wszystkie konstruktory przechowują typ obiektu alokatora, który zarządza magazynem pamięci dla multiset obiektu i który może zostać później zwrócony przez wywołanie metody get_allocator. Parametr alokatora jest często pomijany w deklaracjach klas i makrach przetwarzania wstępnego używanych do zastępowania alternatywnych alokatorów.

Wszystkie konstruktory inicjują ich wielozestaw.

Wszystkie konstruktory przechowują obiekt funkcji typu Compare, który jest używany do ustanowienia kolejności między kluczami elementu multiset i które mogą być później zwracane przez wywołanie metody key_comp.

Pierwsze trzy konstruktory określają pusty początkowy wielozestaw, drugi określający typ funkcji porównania (Comp) do użycia w ustaleniu kolejności elementów, a trzeci jawnie określając typ alokatora (Al). Słowo kluczowe explicit pomija niektóre rodzaje automatycznej konwersji typów.

Czwarty konstruktor określa kopię elementu multisetRight.

Piąty konstruktor określa kopię obiektu multiset przez przeniesienie Rightelementu .

Konstruktory 6, 7 i 8 określają initializer_list, z których mają być kopine elementy.

Następne trzy konstruktory kopiują zakres [First, Last) z multiset rosnącą jawnością w określaniu typu funkcji porównania i alokatora.

Przykład

// 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=

Zastępuje elementy tego multiset elementu przy użyciu elementów z innego multisetelementu .

multiset& operator=(const multiset& right);

multiset& operator=(multiset&& right);

Parametry

Right
Element multiset , z którego elementy są kopiowane lub przenoszone.

Uwagi

operator= kopiuje lub przenosi elementy w Right tym multisetobiekcie w zależności od używanego typu odwołania (lvalue lub rvalue). Elementy, które znajdują się w tym multiset przed operator= wykonaniem, zostaną odrzucone.

Przykład

// 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

Typ, który dostarcza wskaźnik do elementu w elemecie multiset.

typedef typename allocator_type::pointer pointer;

Uwagi

pointer Typ może służyć do modyfikowania wartości elementu.

W większości przypadków iterator powinien być używany do uzyskiwania dostępu do elementów w multiset obiekcie.

multiset::rbegin

Zwraca iterator odnoszący się do pierwszego elementu w odwróconym wielozestawie.

const_reverse_iterator rbegin() const;

reverse_iterator rbegin();

Wartość zwracana

Odwrotny iterator dwukierunkowy odnoszący się do pierwszego elementu w odwróconym multiset lub odnoszącym się do tego, co było ostatnim elementem w niewróceniu multiset.

Uwagi

rbegin jest używany z odwróconym elementem multiset , tak jak rbegin jest używany z elementem multiset.

Jeśli zwracana wartość rbegin elementu jest przypisana do const_reverse_iteratorobiektu , multiset nie można zmodyfikować obiektu. Jeśli zwracana wartość rbegin elementu jest przypisana do reverse_iteratorobiektu , multiset można go zmodyfikować.

rbegin może służyć do iterowania przez multiset tyły.

Przykład

// 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

Typ, który zawiera odwołanie do elementu przechowywanego w obiekcie multiset.

typedef typename allocator_type::reference reference;

Przykład

// 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

Zwraca iterator, który adresuje lokalizację, która zakończyła się powodzeniem ostatniego elementu w odwróconym elemecie multiset.

const_reverse_iterator rend() const;

reverse_iterator rend();

Wartość zwracana

Odwrotny iterator dwukierunkowy, który adresuje lokalizację, która zakończyła się powodzeniem ostatniego elementu w odwróconym multiset (lokalizacja, która poprzedzała pierwszy element w niewróconym multisetelemecie ).

Uwagi

rend jest używany z odwróconym wielozestawem tak samo, jak end w przypadku elementu multiset.

Jeśli zwracana wartość rend elementu jest przypisana do const_reverse_iteratorobiektu , multiset nie można zmodyfikować obiektu. Jeśli zwracana wartość rend elementu jest przypisana do reverse_iteratorobiektu , multiset można go zmodyfikować.

rend można użyć do testowania, czy iterator odwrotny osiągnął koniec jego wielu zestawów.

Wartość zwracana przez rend nie powinna być wyłuszczone.

Przykład

// 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

Typ, który udostępnia iterator dwukierunkowy, który może odczytywać lub modyfikować element w odwróconym wielozestawie.

typedef std::reverse_iterator<iterator> reverse_iterator;

Uwagi

Typ reverse_iterator służy do iterowania w odwrotnej multiset kolejności.

Przykład

Zobacz przykład, aby zapoznać rbegin się z przykładem sposobu deklarowania i używania elementu reverse_iterator.

multiset::size

Zwraca liczbę elementów w elem.multiset

size_type size() const;

Wartość zwracana

Bieżąca długość obiektu multiset.

Przykład

// 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

Niepodpisany typ liczb całkowitych, który może reprezentować liczbę elementów w obiekcie multiset.

typedef typename allocator_type::size_type size_type;

Przykład

Zobacz przykład, aby size zapoznać się z przykładem deklarowania i używania size_type

multiset::swap

Wymienia elementy dwóch wielozestawów.

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

Parametry

Right
Argument multiset dostarczający elementy do zamiany z docelowym wielozestawem.

Uwagi

Funkcja składowa unieważnia żadne odwołania, wskaźniki lub iteratory, które wyznaczają elementy w dwóch wielozestawach, których elementy są wymieniane.

Przykład

// 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

Zwraca iterator do pierwszego elementu w obiekcie multiset z kluczem większym niż określony klucz.

const_iterator upper_bound(const Key& key) const;

iterator upper_bound(const Key& key);

Parametry

key
Klucz argumentu do porównania z kluczem sortowania elementu z multiset przeszukiwanego elementu.

Wartość zwracana

Iterator lub const_iterator adresujący lokalizację elementu w multiset obiekcie z kluczem większym niż klucz argumentu lub adresujący lokalizację, która zakończyła się powodzeniem ostatniego elementu w obiekcie , multiset jeśli nie zostanie znalezione dopasowanie klucza.

Przykład

// 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

Pobiera kopię obiektu porównania używanego do porządkowenia wartości elementów w obiekcie multiset.

value_compare value_comp() const;

Wartość zwracana

Zwraca obiekt funkcji używany multiset do zamawiania jego elementów, który jest parametrem Compareszablonu .

Aby uzyskać więcej informacji na temat Compare, zobacz sekcję multiset Uwagi w temacie Klasa .

Uwagi

Przechowywany obiekt definiuje funkcję składową:

operator bool( const Key&, const Key&_xVal_yVal);

funkcja zwraca wartość true, jeśli _xVal poprzedza wartość i nie jest równa _yVal w kolejności sortowania.

Oba key_compare parametry i value_compare są synonimami parametru Compareszablonu . Oba typy są udostępniane dla zestawów klas i multiset, gdzie są identyczne, aby zapewnić zgodność z mapą klas i multimap, gdzie są one odrębne.

Przykład

// 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

Typ, który udostępnia obiekt funkcji, który może porównać dwa klucze sortowania, aby określić ich względną kolejność w obiekcie multiset.

typedef key_compare value_compare;

Uwagi

value_compare jest synonimem parametru Compareszablonu .

Oba key_compare parametry i value_compare są synonimami parametru Compareszablonu . Oba typy są udostępniane dla zestawów klas i multiset, gdzie są identyczne, aby zapewnić zgodność z mapą klas i multimap, gdzie są one odrębne.

Aby uzyskać więcej informacji na temat Compare, zobacz sekcję Uwagi w temacie Klasa wielozestawowa.

Przykład

Zobacz przykład, aby zapoznać się z przykładem value_comp sposobu deklarowania i używania elementu value_compare.

multiset::value_type

Typ, który opisuje obiekt przechowywany jako element jako multiset element w jego pojemności jako wartość.

typedef Key value_type;

Uwagi

value_type jest synonimem parametru Keyszablonu .

Oba key_type parametry i value_type są synonimami parametru Keyszablonu . Oba typy są udostępniane dla zestawu klas i wielu zestawów, gdzie są identyczne, w celu zapewnienia zgodności z mapą klas i wielomapą, gdzie są one odrębne.

Aby uzyskać więcej informacji na temat Key, zobacz sekcję Uwagi w temacie.

Przykład

// 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.

Zobacz też

Kontenery
Bezpieczeństwo wątku w standardowej bibliotece C++
Dokumentacja standardowej biblioteki C++