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 multiset
Zuordnung 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 Compare
sortiert. Dieses gespeicherte Objekt ist eine Vergleichsfunktion, auf die durch Aufrufen der Memberfunktion key_comp
zugegriffen 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 const multiset 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. |
contains C++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 multiset n. |
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 const
multiset
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_iterator
Datei 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
sonst.
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 multiset
Memberfunktion ::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 crbegin
Objekts 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 crend
Objekts 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 multiset
Element 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 multiset
Element 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
. second
und 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
Bei den ersten beiden Memberfunktionen wird ein bidirektionaler Iterator, der das erste Element bestimmt, das über alle entfernten Elemente hinausgeht, oder ein Element, das das Ende des multiset
Elements darstellt, wenn kein solches Element vorhanden ist.
Gibt für die dritte Memberfunktion die Anzahl der Elemente zurück, die aus dem multiset
Element 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_iterator
Objekts zugewiesen ist, kann das multiset
Objekt nicht geändert werden. Wenn der Rückgabewert find
eines iterator
Objekts 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 multiset
Objekts verwendet wird.
allocator_type get_allocator() const;
Rückgabewert
Der von der multiset
Zuweisung 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 multiset
Element 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_type
werden 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 multiset
wurde.
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 multiset
element 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 V
ist.
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 Compare
handelt.
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 Compare
finden Sie im Abschnitt "Hinweise" des multiset
Themas "Klasse ".
Beispiel
Ein Beispiel für key_comp
das Deklarieren und Verwenden key_compare
finden 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 Key
finden Sie im Abschnitt "Hinweise" des multiset
Themas "Klasse ".
Beispiel
Ein Beispiel für value_type
das Deklarieren und Verwenden key_type
finden 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_allocator
zurü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_comp
zurü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 multiset
Right
.
Der fünfte Konstruktor gibt eine Kopie der multiset
durch Verschieben Right
an.
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_iterator
Objekts zugewiesen ist, kann das multiset
Objekt nicht geändert werden. Wenn der Rückgabewert rbegin
eines reverse_iterator
Objekts 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 multiset
Seite vorausging).
Hinweise
rend
wird mit einem umgekehrten Multiset verwendet, genau wie end
bei einem multiset
.
Wenn der Rückgabewert rend
eines const_reverse_iterator
Objekts zugewiesen ist, kann das multiset
Objekt nicht geändert werden. Wenn der Rückgabewert rend
eines reverse_iterator
Objekts 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_iterator
finden 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 Compare
handelt.
Weitere Informationen Compare
finden 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_compare
finden 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