multiset-Klasse

Die multiset-Klasse der C++-Standardbibliothek wird zum Speichern und Abrufen von Daten aus Auflistungen verwendet, in denen die Werte der jeweiligen Elemente nicht eindeutig sein müssen und in denen sie als die Schlüsselwerte dienen, nach denen die Daten automatisch sortiert werden. Der Schlüsselwert eines Elements in einem multiset Element wird möglicherweise nicht direkt geändert. Stattdessen müssen alte Werte gelöscht und Elemente mit neuen Werten eingefügt werden.

Syntax

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

Parameter

Key
Der in multiset zu speichernde Elementdatentyp.

Compare
Der Typ, der ein Funktionsobjekt bereitstellt, das zwei Elementwerte als Sortierschlüssel vergleicht, um die relative Reihenfolge in der .multiset Das binäre Prädikat kleiner<Schlüssel> ist der Standardwert.

In C++14 können Sie heterogene Suche aktivieren, indem Sie das std::less<>std::greater<> Prädikat angeben, das keine Typparameter enthält. Weitere Informationen finden Sie unter heterogenes Nachschlagen in Associative Containers .

Allocator
Der Typ, der das gespeicherte Allocatorobjekt darstellt, das Details zur multisetZuordnung und Zuordnung des Speichers kapselt. Der Standardwert ist allocator<Key>.

Hinweise

Die C++-Standardbibliotheksklasse multiset lautet:

  • Ein assoziativer Container, der ein Container variabler Größe ist, der den effizienten Abruf von Elementwerten auf Grundlage eines zugeordneten Schlüsselwerts unterstützt.

  • Umkehrbar, da bidirektionale Iteratoren für den Zugriff auf die Elemente bereitgestellt werden.

  • Sortiert, da die Elemente anhand von Schlüsselwerten innerhalb des Containers mit einer angegebenen Vergleichsfunktion sortiert werden.

  • Mehrere elemente müssen nicht über eindeutige Schlüssel verfügen, sodass einem Schlüsselwert viele Elementwerte zugeordnet sein können.

  • Ein einfacher assoziativer Container, da die Elementwerte den Schlüsselwerten entsprechen.

  • Eine Klassenvorlage, da die bereitgestellte Funktionalität generisch und so unabhängig von dem spezifischen Datentyp ist, der als Elemente enthalten ist. Der zu verwendende Datentyp wird stattdessen in der Klassenvorlage zusammen mit der Vergleichsfunktion und der Zuweisung als Parameter angegeben.

Der von der multiset Klasse bereitgestellte Iterator ist ein bidirektionaler Iterator, aber die Klassenmemberfunktionen insert und multiset verfügen über Versionen, die als Vorlagenparameter einen schwächeren Eingabe-Iterator verwenden, dessen Funktionalitätsanforderungen minimaler sind als die von der Klasse bidirektionaler Iteratoren garantierten. Die verschiedenen Iteratorkonzepte bilden eine Family, die durch Verfeinerungen in ihrer Funktionen verknüpft ist. Jedes Iteratorkonzept weist einen eigenen Satz von Anforderungen auf, und die damit funktionierenden Algorithmen müssen die Annahmen hinsichtlich der von diesem Iteratortyp bereitgestellten Anforderungen begrenzen. Es kann davon ausgegangen werden, dass ein Eingabeiterator möglicherweise so dereferenziert wird, dass er auf ein Objekt verweist und dieses möglicherweise zum folgenden Iterator in der Sequenz erhöht. Das ist ein minimaler Funktionssatz, allerdings genügt er, um sinnvoll über einen Bereich von Iteratoren (First, Last) im Kontext der Klassenmemberfunktionen zu sprechen.

Die Auswahl des Containertyps sollte im Allgemeinen auf Grundlage des für die Anwendung erforderlichen Suchen und Einfügetyps erfolgen. Assoziative Container sind auf Such-, Einfüge- und Entfernvorgänge optimiert. Die Memberfunktionen, die diese Vorgänge explizit unterstützen, sind effizient, und zwar in einer Zeit, die im Durchschnitt proportional zum Logarithmus der Anzahl der Elemente im Container liegt. Durch das Einfügen von Elementen werden keine Iteratoren ungültig, und durch das Entfernen von Elementen werden nur die Iteratoren ungültig, die auf die entfernten Elemente verwiesen haben.

Dies multiset sollte der assoziative Container der Wahl sein, wenn die Bedingungen, die die Werte ihren Schlüsseln zuordnen, von der Anwendung erfüllt werden. Die Elemente eines Elements multiset können mehrere sein und als eigene Sortierschlüssel dienen, sodass Schlüssel nicht eindeutig sind. Ein Modell für diesen Typ der Struktur ist eine geordnete Liste von z. B. Wörtern, in denen die Wörter möglicherweise mehrmals auftreten. Wenn mehrfaches Vorkommen der Wörter nicht zugelassen wurde, ist eine Menge die geeignete Containerstruktur. Wenn eindeutige Definitionen als Werte zur Liste von eindeutigen Schlüsselwörtern angefügt wurden, ist eine Zuordnung eine äquivalente Struktur, um diese Daten zu enthalten. Wenn die Definitionen stattdessen nicht eindeutig waren, wäre ein multimap Container der Wahl.

Die multiset Reihenfolge, die sie steuert, wird durch Aufrufen eines gespeicherten Funktionsobjekts vom Typ Comparesortiert. Dieses gespeicherte Objekt ist eine Vergleichsfunktion, auf die durch Aufrufen der Memberfunktion key_compzugegriffen werden kann. Im Allgemeinen müssen die Elemente nur kleiner als vergleichbar sein, um diese Reihenfolge festzulegen: sodass aufgrund von zwei Elementen entweder festgestellt werden kann, dass sie gleichwertig sind (im Sinne, dass keines kleiner als der andere ist) oder dass ein Element kleiner als der andere ist. Dies führt zu einer Sortierung zwischen den nicht gleichwertigen Elementen. Etwas technischer betrachtet ist die Vergleichsfunktion ein binäres Prädikat, das eine strenge schwache Sortierung im mathematischen Sinn verursacht. Ein binäres Prädikat f(x, y) ist ein Funktionsobjekt mit zwei Argumentobjekten x und y und einem Rückgabewert von true oder false. Eine sortierung, die einem Satz auferlegt wird, ist eine strenge schwache Sortierung, wenn das binäre Prädikat irreflexiv, antisymmetrisch und transitiv ist und wenn die Äquivalenz transitiv ist, wobei zwei Objekte x und y definiert werden, die gleich sind, wenn sowohl f(x,y) als auch f(y,x) falsch sind. Wenn der stärkere Gleichheitszustand zwischen Schlüsseln die Äquivalenz ersetzt, erfolgt die Sortierung total (d. h., alle Elemente werden zueinander sortiert), und die verglichenen Schlüssel sind von den einander nicht mehr zu unterscheiden.

In C++14 können Sie heterogene Suche aktivieren, indem Sie das std::less<>std::greater<> Prädikat angeben, das keine Typparameter enthält. Weitere Informationen finden Sie unter heterogenes Nachschlagen in Associative Containers .

Konstruktoren

Konstruktor Beschreibung
multiset Erstellt ein multiset-Element, das leer oder die Kopie eines ganzen angegebenen multiset-Elements oder eines Teils davon ist.

TypeDefs

Typname Beschreibung
allocator_type Eine Typedef für die allocator-Klasse für das multiset-Objekt.
const_iterator Eine Typedef für einen bidirektionalen Iterator, der ein const-Element in der multiset lesen kann.
const_pointer Eine Typedef für einen Zeiger auf ein const-Element in einer multiset.
const_reference Ein Typedef für einen Verweis auf ein Element, das in einem constmultiset Element zum Lesen und Ausführen von const Vorgängen gespeichert ist.
const_reverse_iterator Eine Typedef für einen bidirektionalen Iterator, der ein beliebiges const-Element in der multiset lesen kann.
difference_type Ein Ganzzahltyp mit Vorzeichen für die Anzahl von Elementen einer multiset in einem Bereich zwischen Elementen, auf die von Iteratoren gezeigt wird.
iterator Eine Typedef für einen bidirektionalen Iterator, der ein beliebiges Element in einer multiset lesen oder ändern kann.
key_compare Eine Typedef für ein Funktionsobjekt, das zwei Sortierschlüssel vergleichen kann, um die relative Position von zwei Elementen in der multiset zu bestimmen.
key_type Eine Typedef für ein Funktionsobjekt, das zwei Sortierschlüssel vergleichen kann, um die relative Position von zwei Elementen in der multiset zu bestimmen.
pointer Eine Typedef für einen Zeiger auf ein Element in einer multiset.
reference Eine Typedef für einen Verweis auf ein in einer multiset gespeichertes Element.
reverse_iterator Eine Typedef für einen bidirektionalen Iterator, der ein Element in einer umgekehrten multiset lesen oder ändern kann.
size_type Eine Ganzzahltyp ohne Vorzeichen, der die Anzahl von Elementen in multiset darstellen kann.
value_compare Die Typedef für ein Funktionsobjekt, das zwei Elemente als Sortierschlüssel vergleichen kann, um ihre relative Position in der multiset zu bestimmen.
value_type Eine Typedef, die ein Objekt beschreibt, das als Element und multiset in seiner Kapazität als Wert gespeichert wird.

Memberfunktionen

Memberfunktion Beschreibung
begin Gibt einen Iterator zurück, der auf das erste Element in der multiset zeigt.
cbegin Gibt einen konstanten Iterator zurück, der das erste Element in der multiset adressiert.
cend Gibt einen konstanten Iterator zurück, der den Speicherort adressiert, der dem letzten Element eines multiset-Elements nachfolgt.
clear Löscht alle Elemente einer multiset auf.
containsC++20 Überprüfen Sie, ob ein Element mit dem angegebenen Schlüssel in der .multiset
count Gibt die Anzahl von Elementen in einer multiset zurück, deren Schlüssel dem als Parameter angegebenen Schlüssel entspricht.
crbegin Gibt einen konstanten Iterator zurück, der das erste Element im umgekehrten multiset-Element adressiert.
crend Gibt einen konstanten Iterator zurück, der den Speicherort adressiert, der dem letzten Element eines umgekehrten multiset-Elements nachfolgt.
emplace Fügt ein Element ein, das vor Ort in ein multiset-Element erstellt wird.
emplace_hint Fügt ein Element ein, das vor Ort mit einem Platzierungshinweis in ein multiset-Element erstellt wird.
empty Testet, ob ein multiset-Element leer ist.
end Gibt einen Iterator zurück, der auf den Speicherort zeigt, der hinter dem letzten Element einer multiset liegt.
equal_range Gibt ein Paar von Iteratoren zurück. Der erste Iterator im Paar zeigt auf das erste Element in multiset mit einem Schlüssel, der größer ist, als ein bestimmter Schlüssel. Der zweite Iterator im Paar zeigt auf das erste Element in der multiset mit einem Schlüssel, der größer oder gleich dem Schlüssel ist.
erase Es wird ein Element oder ein Bereich von Elementen in einem multiset von angegebenen Speicherorten entfernt, oder es werden die einem angegebenen Schlüssel entsprechenden Elemente entfernt.
find Gibt einen Iterator zurück, der auf den ersten Speicherort eines Elements in einer multiset zeigt, der einen Schlüssel gleich einem angegebenen Schlüssel aufweist.
get_allocator Gibt eine Kopie des zum Erstellen der allocator verwendeten multiset-Objekts zurück.
insert Fügt ein Element oder einen Elementbereich in ein multiset-Element ein.
key_comp Stellt ein Funktionsobjekt bereit, das zwei Sortierschlüssel vergleichen kann, um die relative Position von zwei Elementen in der multiset zu bestimmen.
lower_bound Gibt einen Iterator zum ersten Element in einem multiset-Element mit einem Schlüssel zurück, der gleich oder größer ist, als ein angegebener Schlüssel.
max_size Gibt die Maximallänge der multiset zurück.
rbegin Gibt einen Iterator zurück, der auf das erste Element in einer umgekehrten multiset zeigt.
rend Gibt einen Iterator zurück, der auf den Speicherort zeigt, der auf das letzte Element einer umgekehrten multiset folgt.
size Gibt die Anzahl von Elementen in einer multiset zurück.
swap Tauscht die Elemente zweier multisetn.
upper_bound Gibt einen Iterator zum ersten Element in einem multiset-Element mit einem Schlüssel zurück, der größer als ein angegebener Schlüssel ist.
value_comp Ruft eine Kopie des Vergleichsobjekts ab, das verwendet wird, um Elementwerte in einer multiset zu sortieren.

Operatoren

Operator Beschreibung
operator= Ersetzt die Elemente eines multiset-Elements durch eine Kopie eines anderen multiset-Elements.

Anforderungen

Header<set>:

Namespace:std

multiset::allocator_type

Ein Typ, der die Allocator-Klasse für das multiset Objekt darstellt

typedef Allocator allocator_type;

Hinweise

allocator_type ist ein Synonym für den Vorlagenparameter Allocator.

Weitere Informationen zu Allocator finden Sie im Abschnitt „Hinweise“ unter multiset-Klasse.

Beispiel

Sehen Sie sich das Beispiel für get_allocator ein Beispiel für die Verwendung von allocator_type

multiset::begin

Gibt ein Iterator zurück, der das erste Element im multiset-Element adressiert.

const_iterator begin() const;

iterator begin();

Rückgabewert

Ein bidirektionaler Iterator, der das erste Element in der oder an der Position angibt, an der multiset ein leeres Multiset erfolgreich war.

Beispiel

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

Gibt einen const-Iterator zurück, mit dem das erste Element im Bereich behandelt wird.

const_iterator cbegin() const;

Rückgabewert

Ein bidirektionaler const-Access-Iterator, der auf das erste Element des Bereichs zeigt oder auf die Position direkt hinter dem Ende eines leeren Bereichs (für einen leeren Bereich gilt cbegin() == cend()).

Hinweise

Mit dem Rückgabewert von cbegin, die Elemente im Bereich können nicht geändert werden.

Sie können diese Memberfunktion anstelle der begin()-Memberfunktion verwenden, um sicherzustellen, dass der Rückgabewert const_iterator ist. Normalerweise wird sie zusammen mit dem auto-Typableitungs-Schlüsselwort verwendet, wie im folgenden Beispiel gezeigt. Im folgenden Beispiel ist Container ein beliebiger änderbarer (Nicht-const-)Container, der begin() und cbegin() unterstützt.

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

// i2 is Container<T>::const_iterator

multiset::cend

Gibt einen const-Iterator zurück, der den Speicherort adressiert, der dem letzten Element eines Bereichs unmittelbar nachfolgt.

const_iterator cend() const;

Rückgabewert

Ein bidirektionaler const-Access-Iterator, der auf eine Position unmittelbar nach dem Ende des Bereichs verweist.

Hinweise

cend wird verwendet, um zu testen, ob ein Iterator das Ende seines Bereichs übergeben hat.

Sie können diese Memberfunktion anstelle der end()-Memberfunktion verwenden, um sicherzustellen, dass der Rückgabewert const_iterator ist. Normalerweise wird sie zusammen mit dem auto-Typableitungs-Schlüsselwort verwendet, wie im folgenden Beispiel gezeigt. Im folgenden Beispiel ist Container ein beliebiger änderbarer (Nicht-const-)Container, der end() und cend() unterstützt.

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

// i2 is Container<T>::const_iterator

Der zurückgegebene cend Wert sollte nicht abgeleitet werden.

multiset::clear

Löscht alle Elemente einer multiset auf.

void clear();

Beispiel

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

Ein Typ, der einen bidirektionalen Iterator bereitstellt, der im const-Element ein multiset-Element lesen kann.

typedef implementation-defined const_iterator;

Hinweise

Ein Typ const_iterator kann nicht verwendet werden, um den Wert eines Elements zu ändern.

Beispiel

Sehen Sie sich das Beispiel für begin ein Beispiel für die Verwendung von const_iterator.

multiset::const_pointer

Ein Typ, der einen Zeiger auf ein const-Element in einem multiset-Element bereitstellt.

typedef typename allocator_type::const_pointer const_pointer;

Hinweise

Ein Typ const_pointer kann nicht verwendet werden, um den Wert eines Elements zu ändern.

In den meisten Fällen sollte ein Iterator verwendet werden, um auf die Elemente in einem multiset Objekt zuzugreifen.

multiset::const_reference

Ein Typ, der einen Verweis auf ein Element bereitstellt, das in einem constmultiset Element zum Lesen und Ausführen von const Vorgängen gespeichert ist.

typedef typename allocator_type::const_reference const_reference;

Beispiel

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

Ein Typ, der einen bidirektionalen Iterator bereitstellt, der im const-Element jedes multiset-Element lesen kann.

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

Hinweise

Ein Typ const_reverse_iterator kann den Wert eines Elements nicht ändern und wird zum Durchlaufen des multiset umgekehrten Elements verwendet.

Beispiel

Ein Beispiel für rend das Deklarieren und Verwenden der const_reverse_iteratorDatei finden Sie im Beispiel.

multiset::contains

Überprüfen Sie, ob ein Element mit dem angegebenen Schlüssel in der .multiset

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

Parameter

K
Der Typ des Schlüssels.

key
Der Schlüsselwert des Elements, nach dem gesucht werden soll.

Rückgabewert

true wenn das Element im Container gefunden wird; false Andernfalls.

Hinweise

contains() ist neu in C++20. Geben Sie zur Verwendung die Compileroption /std:c++20 oder höher an.

template<class K> bool contains(const K& key) const nimmt nur an der Überladungsauflösung teil, wenn key_compare dies transparent ist. Weitere Informationen finden Sie unter heterogene Suche in assoziativen Containern .

Beispiel

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

Gibt die Anzahl von Elementen in einem multiset-Element zurück, dessen Schlüssel dem von einem Parameter angegebenen Schlüssel entspricht.

size_type count(const Key& key) const;

Parameter

key
Der Schlüssel der Elemente, die von der multiset.

Rückgabewert

Die Anzahl der Elemente in derEn multiset Sortierschlüssel entspricht dem Parameterschlüssel.

Hinweise

Die Memberfunktion ermöglicht die Rückgabe der Anzahl von Elementen x im Bereich

[ lower_bound(key), upper_bound(key)

Beispiel

Das folgende Beispiel veranschaulicht die Verwendung der multisetMemberfunktion ::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

Gibt einen const-Iterator zurück, der das erste Element in einem umgekehrten Multiset adressiert.

const_reverse_iterator crbegin() const;

Rückgabewert

Ein umgekehrter bidirektionaler const-Iterator, mit dem das erste Element in einem umgekehrten Multiset adressiert wird bzw. mit dem das ehemals letzte Element in dem nicht umgekehrten Multiset adressiert wird.

Hinweise

crbegin wird mit einem umgekehrten Multiset verwendet, genau wie mit einem multiset.

Mit dem Rückgabewert des crbeginObjekts kann das multiset Objekt nicht geändert werden.

Mit crbegin kann ein multiset rückwärts durchlaufen werden.

Beispiel

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

Gibt einen const-Iterator zurück, der den Speicherort adressiert, der dem letzten Element einer umgekehrten Multimenge folgt.

const_reverse_iterator crend() const;

Rückgabewert

Ein bidirektionaler const_reverse-Iterator, der den Speicherort adressiert, der dem letzten Element in einer umgekehrten Multimenge folgt (d.h. den Speicherort, der dem ersten Element in der nicht umgekehrten Multimenge vorangegangen war).

Hinweise

crend wird mit einem umgekehrten Multiset verwendet, genau wie end bei einem multiset.

Mit dem Rückgabewert des crendObjekts kann das multiset Objekt nicht geändert werden.

crend kann verwendet werden, um zu testen, ob das Ende der multiset von einem umgekehrten Iterator erreicht wurde.

Der zurückgegebene crend Wert sollte nicht abgeleitet werden.

Beispiel

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

Ein Ganzzahltyp mit Vorzeichen, der dazu verwendet werden kann, die Anzahl von Elementen eines multiset-Elements in einen Bereich zwischen Elementen darzustellen, auf die von Iteratoren gezeigt wird.

typedef typename allocator_type::difference_type difference_type;

Hinweise

difference_type ist der Typ, der beim Subtrahieren oder Inkrementieren über Iteratoren des Containers zurückgegeben wird. difference_type wird normalerweise verwendet, um die Anzahl von Elementen im Bereich [ first, last) zwischen den Iteratoren first und last darzustellen. Dazu gehört das Element, auf das durch first gezeigt wird sowie der Bereich von Elementen bis zu (aber nicht einschließlich) dem Element, auf das durch last gezeigt wird.

Obwohl difference_type für alle Iteratoren verfügbar ist, die die Anforderungen eines Eingabe-Iterators erfüllen, die die Klasse bidirektionaler Iteratoren enthält, die von umkehrbaren Containern wie Set unterstützt werden, wird die Subtraktion zwischen Iteratoren nur von Iteratoren mit wahlfreiem Zugriff unterstützt, die von einem Zufallszugriffscontainer wie Vektor bereitgestellt werden.

Beispiel

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

Fügt ein Element mit einem Platzierungshinweis ein, das vor Ort erstellt wird (Es werden keine Kopier- oder Verschiebevorgänge ausgeführt).

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

Parameter

args
Die Argumente, die weitergeleitet werden, um ein Element zu konstruieren, das in das multisetElement eingefügt werden soll.

Rückgabewert

Ein Iterator zum neu eingefügten Element.

Hinweise

Von dieser Funktion werden keine Verweise auf Containerelemente für ungültig erklärt, aber möglicherweise werden alle Iteratoren für den Containers für ungültig erklärt.

Wenn eine Ausnahme ausgelöst wird, wird der Containerstatus während der Emplacement nicht geändert.

Beispiel

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

Fügt ein Element mit einem Platzierungshinweis ein, das vor Ort erstellt wird (Es werden keine Kopier- oder Verschiebevorgänge ausgeführt).

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

Parameter

args
Die Argumente, die weitergeleitet werden, um ein Element zu konstruieren, das in das multisetElement eingefügt werden soll.

where
Die Position, an dem mit der Suche nach dem richtigen Einfügepunkt begonnen wird. (Wenn dieser Punkt where direkt vorausgeht, kann die Einfügung in amortisierter konstanter Zeit anstelle von logarithmischer Zeit eintreten.)

Rückgabewert

Ein Iterator zum neu eingefügten Element.

Hinweise

Von dieser Funktion werden keine Verweise auf Containerelemente für ungültig erklärt, aber möglicherweise werden alle Iteratoren für den Containers für ungültig erklärt.

Wenn eine Ausnahme ausgelöst wird, wird der Containerstatus während der Emplacement nicht geändert.

Ein Codebeispiel finden Sie unter set::emplace_hint.

multiset::empty

Testet, ob ein multiset-Element leer ist.

bool empty() const;

Rückgabewert

true wenn die multiset leer ist; false wenn dies multiset nicht zu ernennen ist.

Beispiel

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

Gibt den "past-the-end"-Iterator zurück.

const_iterator end() const;

iterator end();

Rückgabewert

Der "past-the-end"-Iterator. Wenn die multiset leer ist, gilt anschließend multiset::end() == multiset::begin().

Hinweise

end wird verwendet, um zu testen, ob ein Iterator das Ende seines Multisets bestanden hat.

Der zurückgegebene end Wert sollte nicht abgeleitet werden.

Ein Codebeispiel finden Sie unter multiset::find.

multiset::equal_range

Gibt ein Iteratorpaar jeweils bezogen auf das erste Element in einem multiset-Objekt mit einem Schlüssel zurück, der größer als ein bestimmter Schlüssel ist, bzw. bezogen auf das erste Element im multiset-Objekt mit einem Schlüssel, der größer oder gleich dem Schlüssel ist.

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

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

Parameter

key
Der Argumentschlüssel, der mit dem Sortierschlüssel eines Elements aus dem multiset durchsuchten Element verglichen werden soll.

Rückgabewert

Ein Paar Iteratoren, sodass der erste der lower_bound Schlüssel und der zweite der upper_bound Schlüssel ist.

Sie können auf den ersten Iterator eines von einer Memberfunktion zurückgegebenen Paars pr zugreifen, indem Sie pr. first, und verwenden Sie *( zum Ableiten des unteren Begrenzungs iterators *( pr. first). Sie können auf den zweiten Iterator eines von einer Memberfunktion zurückgegebenen Paars pr zugreifen, indem Sie pr. secondund zum Ableiten der oberen Begrenzungs iterator verwenden Sie *( pr. . second

Beispiel

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

Es wird ein Element oder ein Bereich von Elementen in einem multiset von angegebenen Speicherorten entfernt, oder es werden die einem angegebenen Schlüssel entsprechenden Elemente entfernt.

iterator erase(
    const_iterator Where);

iterator erase(
    const_iterator First,
    const_iterator Last);

size_type erase(
    const key_type& Key);

Parameter

Where
Die Position des zu entfernenden Elements.

First
Die Position des ersten zu entfernenden Elements.

Last
Die Position direkt hinter dem letzten zu entfernenden Element.

key
Der Schlüsselwert der zu entfernenden Elemente.

Rückgabewert

Für die ersten beiden Memberfunktionen wird ein bidirektionaler Iterator, der das erste Element neu bestimmt Standard über alle entfernten Elemente hinaus, oder ein Element, das das Ende des multiset Elements ist, wenn kein solches Element vorhanden ist.

Gibt für die dritte Memberfunktion die Anzahl der Elemente zurück, die aus dem multisetElement entfernt wurden.

Hinweise

Ein Codebeispiel finden Sie unter set::erase.

multiset::find

Gibt einen Iterator zurück, der auf die Position eines Elements in einem multiset Element verweist, das über einen Schlüssel verfügt, der einem angegebenen Schlüssel entspricht.

iterator find(const Key& key);

const_iterator find(const Key& key) const;

Parameter

key
Der Schlüsselwert, der durch den Sortierschlüssel eines Elements abgeglichen werden soll, aus dem multiset durchsucht wird.

Rückgabewert

Ein Iterator, der auf die Position eines Elements mit einem angegebenen Schlüssel verweist, oder die Position, an der das letzte Element im multiset ( multiset::end()) erfolgreich war, wenn keine Übereinstimmung für den Schlüssel gefunden wird.

Hinweise

Die Memberfunktion gibt einen Iterator zurück, der sich auf ein Element in dem Schlüssel bezieht, dessen multiset Schlüssel dem Argument key unter einem binären Prädikat entspricht, das eine Sortierung basierend auf einer Vergleichbarkeitsbeziehung auslöst.

Wenn der Rückgabewert find eines const_iteratorObjekts zugewiesen ist, kann das multiset Objekt nicht geändert werden. Wenn der Rückgabewert find eines iteratorObjekts zugewiesen ist, kann das multiset Objekt geändert werden.

Beispiel

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

Gibt eine Kopie des allocator -Objekts zurück, das zum Erstellen des multisetObjekts verwendet wird.

allocator_type get_allocator() const;

Rückgabewert

Der von der multisetZuweisung verwendete Allokator .

Hinweise

Allocators für die multiset Klasse geben an, wie die Klasse Speicher verwaltet. Für die meisten Programmieranforderungen reichen die standardmäßigen allocator-Objekte mit Container-Klassen der C++-Standardbibliothek aus. Schreiben und Verwenden Ihrer eigener Zuweisungsklasse ist ein C++ -Thema für Fortgeschrittene.

Beispiel

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

Fügt ein Element oder einen Elementbereich in ein multiset-Element ein.

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

Parameter

Val
Der Wert eines Elements, das in das multisetElement eingefügt werden soll.

Where
Die Position, an dem mit der Suche nach dem richtigen Einfügepunkt begonnen wird. (Wenn dieser Punkt Where direkt vorausgeht, kann die Einfügung in amortisierter konstanter Zeit anstelle von logarithmischer Zeit eintreten.)

ValTy
Der Vorlagenparameter, der den Argumenttyp angibt, mit dem multiset ein Element erstellt value_typewerden kann, und perfekte Weiterleitungen Val als Argument.

First
Die Position des ersten zu kopierenden Elements.

Last
Die Position direkt über den letzten zu kopierenden Elements.

1
Vorlagenfunktionsargument, das die Anforderungen eines input_iterator_tag Elements eines Typs erfüllt, der zum Erstellen von 1 Objekten verwendet werden kann.

IList
Die initializer_list Elemente, von denen die Elemente kopiert werden sollen.

Rückgabewert

Die Memberfunktionen für ein einzelnes Element einfügen (1) und (2) geben einen Iterator an die Position zurück, an der das neue Element eingefügt multisetwurde.

Die Elementfunktionen mit einem Element mit Hinweis, (3) und (4) geben einen Iterator zurück, der auf die Position zeigt, an der das neue Element in das multisetelement eingefügt wurde.

Hinweise

Von dieser Funktion werden keine Zeiger oder Verweise für ungültig erklärt, aber möglicherweise werden alle Iteratoren für den Containers für ungültig erklärt.

Wenn eine Ausnahme ausgelöst wird, wird der Containerstatus während der Einfügung nur eines Elements nicht geändert. Wird beim Einfügen mehrerer Elementen eine Ausnahme ausgelöst, wird der Container in einem nicht angegebenen doch gültigen Zustand belassen.

Der value_type Container ist ein Typedef, der zum Container gehört, und für den Satz multiset<V>::value_type ein Typ const Vist.

Die Bereichsmemmfunktion (5) fügt die Abfolge von Elementwerten in ein multiset Element ein, das jedem Element entspricht, das von einem Iterator im Bereich [First, Last)adressiert wird; daher Last wird nicht eingefügt. Die Containermemberfunktion end() bezieht sich auf die Position direkt hinter dem letzten Element im Container. Z. B fügt die Anweisung s.insert(v.begin(), v.end()); alle Elemente von v in s ein.

Die Initialisierungslistenelementfunktion (6) verwendet zum initializer_list Kopieren von Elementen in die multiset.

Informationen zum Einfügen eines direkt erstellten Elements , d. h. es werden keine Kopier- oder Verschiebungsvorgänge ausgeführt – siehe multiset::emplace und multiset::emplace_hint.

Beispiel

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

Ein Typ, der einen konstanten bidirektionalen Iterator bereitstellt, der jedes Element in einem multiset.

typedef implementation-defined iterator;

Beispiel

Sehen Sie sich das Beispiel an, um ein Beispiel für das Deklarieren und Verwenden eines iterator.

multiset::key_comp

Ruft eine Kopie des Vergleichsobjekts ab, das zum Sortieren der Schlüssel in multiset verwendet wird.

key_compare key_comp() const;

Rückgabewert

Gibt das Funktionsobjekt zurück, das von einem Objekt multiset verwendet wird, um seine Elemente zu sortieren, bei dem es sich um den Vorlagenparameter Comparehandelt.

Weitere Informationen zu Compare finden Sie im Abschnitt „Hinweise“ unter multiset-Klasse.

Hinweise

Das gespeicherte Objekt definiert die Memberfunktion

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

Sie gibt nur dann TRUE zurück, wenn x in der Sortierreihenfolge y vorausgeht.

Beide key_compare sind value_compare Synonyme für den Vorlagenparameter Compare. Beide Typen werden für den Klassensatz und das Multiset bereitgestellt, wobei sie identisch sind, zur Kompatibilität mit der Klassenzuordnung und multimap, wobei sie eindeutig sind.

Beispiel

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

Eine Typ, der ein Funktionsobjekt bereitstellt, das zwei Sortierschlüssel vergleichen kann, um die relative Position von zwei Elementen im multiset-Element zu bestimmen.

typedef Compare key_compare;

Hinweise

key_compare ist ein Synonym für den Vorlagenparameter Compare.

Weitere Informationen Comparefinden Sie im Abschnitt "Hinweise" des multiset Themas "Klasse ".

Beispiel

Ein Beispiel für key_comp das Deklarieren und Verwenden key_comparefinden Sie im Beispiel.

multiset::key_type

Ein Typ, der ein Funktionsobjekt bereitstellt, das Sortierschlüssel vergleichen kann, um die relative Reihenfolge von zwei Elementen in der multiset.

typedef Key key_type;

Hinweise

key_type ist ein Synonym für den Vorlagenparameter Key.

Weitere Informationen Keyfinden Sie im Abschnitt "Hinweise" des multiset Themas "Klasse ".

Beispiel

Ein Beispiel für value_type das Deklarieren und Verwenden key_typefinden Sie im Beispiel.

multiset::lower_bound

Gibt einen Iterator zum ersten Element in einem multiset-Element mit einem Schlüssel zurück, der gleich oder größer ist, als ein angegebener Schlüssel.

const_iterator lower_bound(const Key& key) const;

iterator lower_bound(const Key& key);

Parameter

key
Der Argumentschlüssel, der mit dem Sortierschlüssel eines Elements aus dem multiset durchsuchten Element verglichen werden soll.

Rückgabewert

Eine iterator oder const_iterator die die Position eines Elements in einem multiset Element angibt, das mit einem Schlüssel gleich oder größer als dem Argumentschlüssel ist, oder die die Position angibt, an der das letzte Element erfolgreich war multiset , wenn keine Übereinstimmung für den Schlüssel gefunden wird.

Beispiel

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

Gibt die Maximallänge der multiset zurück.

size_type max_size() const;

Rückgabewert

Die maximal mögliche Länge der multiset.

Beispiel

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

Erstellt ein multiset-Element, das leer oder die Kopie eines ganzen anderen multiset-Elements oder eines Teils davon ist.

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

Parameter

Al
Die für dieses multiset-Objekt zu verwendende Speicherzuweisungsklasse, dessen Standard Allocator ist.

Comp
Die Vergleichsfunktion vom Typ const Compare, die verwendet wird, um die Elemente in multiset, deren Standard Compare ist, zu sortieren.

Right
der multiset das konstruierte Multiset eine Kopie sein soll.

First
Die Position des ersten Elements in dem zu kopierenden Elementbereich.

Last
Die Position des ersten Elements nach dem zu kopierenden Elementbereich.

IList
Die initializer_list Elemente, von denen die Elemente kopiert werden sollen.

Hinweise

Alle Konstruktoren speichern einen Typ von Allocator-Objekt, der speicherverwaltung für die multiset und die später durch Aufrufen get_allocatorzurückgegeben werden kann. Der Zuweisungsparameter wird häufig aus den Klassendeklarationen und den Vorverarbeitungsmakros weggelassen, die zum Ersetzen alternativer Zuweisungen verwendet werden.

Alle Konstruktoren initialisieren ihre Multimenge.

Alle Konstruktoren speichern ein Funktionsobjekt vom Typ Compare, das verwendet wird, um eine Reihenfolge zwischen den Schlüsseln der multiset und die später durch Aufrufen key_compzurückgegeben werden können.

Die ersten drei Konstruktoren geben ein leeres anfängliches Multiset an, das zweite, das den Typ der Vergleichsfunktion (Comp) angibt, der verwendet werden soll, um die Reihenfolge der Elemente festzulegen, und der dritte explizit den zu verwendenden Allocatortyp (Al) angeben. Mit dem Schlüsselwort explicit werden bestimmte Arten automatischer Typumwandlung unterdrückt.

Der vierte Konstruktor gibt eine Kopie der multisetRight.

Der fünfte Konstruktor gibt eine Kopie der multiset durch Verschieben Rightan.

Die Konstruktoren 6., 7. und 8. geben eine initializer_list an, aus der die Elemente kopiert werden sollen.

Die nächsten drei Konstruktoren kopieren den Bereich eines multiset Bereichs [First, Last) mit zunehmender Explizitkeit bei der Angabe des Typs der Vergleichsfunktion und des Allokators.

Beispiel

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

Ersetzt die Elemente dieses multiset mithilfe von Elementen eines anderen multiset.

multiset& operator=(const multiset& right);

multiset& operator=(multiset&& right);

Parameter

Right
Das multiset-Element, aus dem Elemente kopiert oder verschoben werden.

Hinweise

operator= kopiert oder verschiebt die Elemente in Right je nach Referenztyp (l-Wert oder r-Wert) in dieses multiset. Elemente, die sich vor dem Ausführen von operator= in diesem multiset befinden, werden verworfen.

Beispiel

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

Ein Typ, der einen Zeiger auf ein Element in einer multiset bereitstellt.

typedef typename allocator_type::pointer pointer;

Hinweise

Ein Typ pointer kann verwendet werden, um den Wert eines Elements zu ändern.

In den meisten Fällen sollte ein Iterator verwendet werden, um auf die Elemente in einem multiset Objekt zuzugreifen.

multiset::rbegin

Gibt einen Iterator zurück, der das erste Element in einem umgekehrten Multiset adressiert.

const_reverse_iterator rbegin() const;

reverse_iterator rbegin();

Rückgabewert

Ein umgekehrter bidirektionaler Iterator, der das erste Element in einer umgekehrten multiset Oder adressiert, was das letzte Element in der unreversierten multiset.

Hinweise

rbegin wird mit einer umgekehrten multiset Verwendet, wie rbegin mit einem multiset.

Wenn der Rückgabewert rbegin eines const_reverse_iteratorObjekts zugewiesen ist, kann das multiset Objekt nicht geändert werden. Wenn der Rückgabewert rbegin eines reverse_iteratorObjekts zugewiesen ist, kann das multiset Objekt geändert werden.

Mit rbegin kann ein multiset rückwärts durchlaufen werden.

Beispiel

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

Ein Typ, der einen Verweis auf ein in einer multiset gespeichertes Element bereitstellt.

typedef typename allocator_type::reference reference;

Beispiel

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

Gibt einen Iterator zurück, der den Speicherort adressiert, der dem letzten Element eines umgekehrten multiset-Elements nachfolgt.

const_reverse_iterator rend() const;

reverse_iterator rend();

Rückgabewert

Ein umgekehrter bidirektionaler Iterator, der die Position adressiert, die das letzte Element in einem umgekehrten multiset Element erfolgreich war (die Position, die dem ersten Element in der unreversierten multisetSeite vorausging).

Hinweise

rend wird mit einem umgekehrten Multiset verwendet, genau wie end bei einem multiset.

Wenn der Rückgabewert rend eines const_reverse_iteratorObjekts zugewiesen ist, kann das multiset Objekt nicht geändert werden. Wenn der Rückgabewert rend eines reverse_iteratorObjekts zugewiesen ist, kann das multiset Objekt geändert werden.

Mit rend lässt sich überprüfen, ob ein umgekehrter Iterator das Ende seiner Multimenge erreicht hat.

Der zurückgegebene rend Wert sollte nicht abgeleitet werden.

Beispiel

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

Ein Typ, der einen bidirektionalen Iterator bereitstellt, mit dem ein Element in einer umgekehrten Multimenge gelesen oder geändert werden kann.

typedef std::reverse_iterator<iterator> reverse_iterator;

Hinweise

Ein Typ wird zum Durchlaufen des multiset umgekehrten Typs reverse_iterator verwendet.

Beispiel

Ein Beispiel für rbegin das Deklarieren und Verwenden reverse_iteratorfinden Sie im Beispiel.

multiset::size

Gibt die Anzahl von Elementen in der multiset zurück.

size_type size() const;

Rückgabewert

Die aktuelle Länge des multiset.

Beispiel

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

Eine Ganzzahltyp ohne Vorzeichen, der die Anzahl von Elementen in multiset darstellen kann.

typedef typename allocator_type::size_type size_type;

Beispiel

Ein Beispiel für size das Deklarieren und Verwenden finden Sie unter size_type

multiset::swap

Tauscht die Elemente zweier Multimengen aus.

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

Parameter

Right
Das Multimengenargument, das die Elemente bereitstellt, die mit der Zielmultimenge getauscht werden sollen.

Hinweise

Die Memberfunktion macht keine Verweise, Zeiger oder Iteratoren ungültig, die Elemente in zwei Multimengen bezeichnen, deren Elemente ausgetauscht werden.

Beispiel

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

Gibt einen Iterator zum ersten Element in einem multiset-Element mit einem Schlüssel zurück, der größer als ein angegebener Schlüssel ist.

const_iterator upper_bound(const Key& key) const;

iterator upper_bound(const Key& key);

Parameter

key
Der Argumentschlüssel, der mit dem Sortierschlüssel eines Elements aus dem multiset durchsuchten Element verglichen werden soll.

Rückgabewert

Ein Iterator oder const_iterator die die Position eines Elements in einem multiset element mit einem Schlüssel adressiert, der größer als der Argumentschlüssel ist, oder die die Position adressiert, an der das letzte Element im letzten Element gefunden multiset wird, wenn keine Übereinstimmung für den Schlüssel gefunden wird.

Beispiel

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

Ruft eine Kopie des Vergleichsobjekts ab, das zum Sortieren der Elementwerte in multiset verwendet wird.

value_compare value_comp() const;

Rückgabewert

Gibt das Funktionsobjekt zurück, das von einem Objekt multiset verwendet wird, um seine Elemente zu sortieren, bei dem es sich um den Vorlagenparameter Comparehandelt.

Weitere Informationen Comparefinden Sie im Abschnitt "Hinweise" des multiset Themas "Klasse ".

Hinweise

Das gespeicherte Objekt definiert die Memberfunktion

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

gibt "true" zurück, wenn _xVal es vorangeht und nicht in der Sortierreihenfolge gleich _yVal ist.

Beide key_compare sind value_compare Synonyme für den Vorlagenparameter Compare. Beide Typen werden für die Klassen festgelegt und multiset, wo sie identisch sind, zur Kompatibilität mit der Klassenzuordnung und multimap, wo sie unterschiedlich sind.

Beispiel

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

Der Typ, der ein Funktionsobjekt bereitstellt, das zwei Sortierschlüssel vergleichen kann, um die relative Reihenfolge in der multiset.

typedef key_compare value_compare;

Hinweise

value_compare ist ein Synonym für den Vorlagenparameter Compare.

Beide key_compare sind value_compare Synonyme für den Vorlagenparameter Compare. Beide Typen werden für die Klassen festgelegt und multiset, wo sie identisch sind, zur Kompatibilität mit der Klassenzuordnung und multimap, wo sie unterschiedlich sind.

Weitere Informationen zu Compare finden Sie im Abschnitt „Hinweise“ unter multiset-Klasse.

Beispiel

Ein Beispiel für value_comp das Deklarieren und Verwenden value_comparefinden Sie im Beispiel.

multiset::value_type

Ein Typ, der ein Objekt beschreibt, das als Element multiset als wert gespeichert ist.

typedef Key value_type;

Hinweise

value_type ist ein Synonym für den Vorlagenparameter Key.

Beide key_type sind value_type Synonyme für den Vorlagenparameter Key. Beide Typen werden für den Klassensatz und das Multiset bereitgestellt, wobei sie identisch sind, zur Kompatibilität mit der Klassenzuordnung und multimap, wobei sie eindeutig sind.

Weitere Informationen zu Key finden Sie im Abschnitt „Hinweise“.

Beispiel

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

Siehe auch

Container
Threadsicherheit in der C++-Standardbibliothek
C++-Standardbibliotheksreferenz