Classe multiset
A classe multiset da biblioteca padrão C++ é usada para o armazenamento e a recuperação de dados de uma coleção na qual os valores dos elementos contidos não precisam ser exclusivos e na qual eles atuam como valores de chave, de acordo com os quais os dados são automaticamente ordenados. O valor de chave de um elemento em uma multiset
não pode ser alterado diretamente. Em vez disso, os valores antigos devem ser excluídos e os elementos com novos valores inseridos.
Sintaxe
template <class Key, class Compare =less <Key>, class Allocator =allocator <Key>>
class multiset
Parâmetros
Key
O tipo de dados do elemento a ser armazenado no multiset
.
Compare
O tipo que fornece um objeto de função que pode comparar dois valores de elemento como chaves de classificação para determinar sua ordem relativa no multiset
. O predicado binário less<Key> é o valor padrão.
No C++ 14, você pode habilitar a pesquisa heterogênea ao especificar o predicado std::less<>
ou o std::greater<>
, que não tem nenhum parâmetro de tipo. Confira Pesquisa Heterogênea em Contêineres Associativos para saber mais.
Allocator
O tipo que representa o objeto de alocador armazenado que encapsula detalhes sobre a alocação e a desalocação do multiset
da memória. O valor padrão é allocator<Key>
.
Comentários
A classe multiset
da Biblioteca Padrão C++ é:
Um contêiner associativo, que é um contêiner de tamanho variável que oferece suporte à recuperação eficiente dos valores de elemento com base em um valor de chave associado.
Reversível, pois fornece iteradores bidirecionais para acessar seus elementos.
Classificada, pois seus elementos são ordenados por valores de chave no contêiner, de acordo com uma função de comparação especificada.
Múltipla no sentido de que seus elementos não precisam ter chaves exclusivas para que um valor de chave possa ter muitos valores de elemento associados a ele.
Um contêiner associativo simples, pois seus valores de elemento são seus valores de chave.
Um modelo de classe, pois a funcionalidade que fornece é genérica e, portanto, independente do tipo de dados específico contido como elementos. O tipo de dados a ser usado é especificado como um parâmetro no modelo de classe juntamente com a função de comparação e o alocador.
O iterador fornecido pela classe multiset
é um iterador bidirecional, mas as funções membro de classe insert
e multiset
têm versões que usam como parâmetros de modelo um iterador de entrada mais fraco, cujos requisitos de funcionalidade são mais minimalistas do que aqueles assegurados pela classe de iteradores bidirecionais. Os conceitos de iterador diferente formam uma família relacionada por refinamentos em sua funcionalidade. Cada conceito de iterador tem seu próprio conjunto de requisitos e os algoritmos que funcionam com eles devem limitar suas suposições para os requisitos fornecidos por esse tipo de iterador. Pode ser pressuposto que um iterador de entrada possa ser desreferenciado para fazer referência a algum objeto e que possa ser incrementado para o próximo iterador na sequência. Esse é um conjunto mínimo de funcionalidade, mas é suficiente para poder expressar de forma significativa um intervalo de iteradores [ First
, Last
) no contexto de funções membro da classe.
A escolha do tipo de contêiner deve se basear, de modo geral, no tipo de pesquisa e inserção exigido pelo aplicativo. Os contêineres associativos são otimizados para as operações de pesquisa, inserção e remoção. As funções de membro que dão suporte explicitamente a essas operações são eficientes, realizando-as em um tempo que está na média proporcional para o logaritmo do número de elementos no contêiner. Inserir de elementos não invalida iteradores e remover elementos invalida apenas os iteradores que apontavam os elementos removidos.
A multiset
deve ser o contêiner associativo ideal quando as condições que associam os valores às respectivas chaves forem atendidas pelo aplicativo. Os elementos de uma multiset
podem ser múltiplos e atuar como suas próprias chaves de classificação, de modo que as chaves não sejam exclusivas. Um modelo para esse tipo de estrutura é uma lista ordenada de palavras, por exemplo, na qual as palavras podem ocorrer mais de uma vez. Não tendo sido permitidas as várias ocorrências das palavras, um conjunto seria a estrutura de contêiner apropriada. Se as definições exclusivas fossem anexadas como valores à lista de palavras-chave exclusivas, um mapa seria uma estrutura apropriada para conter esses dados. Se, em vez disso, as definições não fossem exclusivas, um multimap
seria o contêiner ideal.
A multiset
ordena a sequência que controla chamando um objeto de função armazenado do tipo Compare
. Esse objeto armazenado é uma função de comparação que pode ser acessada chamando a função de membro key_comp
. De modo geral, os elementos precisam ser simplesmente menores que os comparáveis para estabelecer essa ordem: desse modo, considerando dois elementos, pode ser determinado que, ou eles são equivalentes (no sentido de que nenhum deles é menor que o outro), ou que um é menor que o outro. Isso resulta em uma ordenação entre os elementos não equivalentes. Fazendo uma observação mais técnica, a função de comparação é um predicado binário que induz a uma ordenação fraca restrita no sentido matemático padrão. Um predicado binário f(x, y) é um objeto de função que tem dois objetos de argumento x e y, e um valor retornado de true
ou false
. Uma ordenação imposta em um conjunto será uma ordenação fraca restrita se o predicado binário for irreflexivo, antissimétrico e transitivo e se a equivalência for transitiva, em que dois objetos x e y são definidos para serem equivalentes quando ambos f(x,y) e f(y,x) são falsos. Se a condição mais forte de igualdade entre as chaves substituir essa equivalência, a ordenação será total (no sentido de que todos os elementos serão ordenados um em relação ao outro) e as chaves correspondentes não poderão ser diferenciadas uma da outra.
No C++ 14, você pode habilitar a pesquisa heterogênea ao especificar o predicado std::less<>
ou o std::greater<>
, que não tem nenhum parâmetro de tipo. Confira Pesquisa Heterogênea em Contêineres Associativos para saber mais.
Construtores
Construtor | Descrição |
---|---|
multiset | Constrói um multiset que está vazio ou que é uma cópia de todo ou parte de um multiset especificado. |
Typedefs
Nome do tipo | Descrição |
---|---|
allocator_type |
Um typedef para a classe allocator do objeto multiset . |
const_iterator |
Um typedef para um iterador bidirecional que pode ler um elemento const no multiset . |
const_pointer |
Um typedef de um ponteiro para um elemento const em um multiset . |
const_reference |
Um typedef de uma referência para um elemento const armazenado em um multiset para leitura e execução de operações const . |
const_reverse_iterator |
Um typedef para um iterador bidirecional que pode ler qualquer elemento const no multiset . |
difference_type |
Um typedef de inteiro com sinal para o número de elementos de um multiset em um intervalo entre os elementos apontado pelos iteradores. |
iterator |
Um typedef para um iterador bidirecional que pode ler ou modificar qualquer elemento em um multiset . |
key_compare |
Um typedef de um objeto de função que pode comparar duas chaves para determinar a ordem relativa de dois elementos no multiset . |
key_type |
Um typedef de um objeto de função que pode comparar duas chaves de classificação para determinar a ordem relativa de dois elementos no multiset . |
pointer |
Um typedef de um ponteiro para um elemento em um multiset . |
reference |
Um typedef de uma referência para um elemento armazenado em um multiset . |
reverse_iterator |
Um typedef para um iterador bidirecional que pode ler ou modificar um elemento em um multiset invertido. |
size_type |
Um tipo de inteiro sem sinal que pode representar o número de elementos em um multiset . |
value_compare |
O typedef de um objeto de função que pode comparar dois elementos como chaves de classificação para determinar sua ordem relativa no multiset . |
value_type |
Um typedef que descreve um objeto armazenado como um elemento enquanto um multiset em sua capacidade como um valor. |
Funções de membro
Função de membro | Descrição |
---|---|
begin |
Retorna um iterador que aponta para o primeiro elemento no multiset . |
cbegin |
Retorna um iterador const que trata o primeiro elemento no multiset . |
cend |
Retorna um iterador const que trata o local após o último elemento em um multiset . |
clear |
Apaga todos os elementos de um multiset . |
contains C++20 |
Verifique se há um elemento com a chave especificada no multiset . |
count |
Retorna o número de elementos em um multiset cuja chave corresponde à chave especificada como um parâmetro. |
crbegin |
Retorna um iterador const que trata o primeiro elemento em um multiset invertido. |
crend |
Retorna um iterador const que trata o local após o último elemento em um multiset invertido. |
emplace |
Insere um elemento construído adequadamente em um multiset . |
emplace_hint |
Insere um elemento construído adequadamente em um multiset , com uma dica de posicionamento. |
empty |
Testa se multiset está vazio. |
end |
Retorna um iterador que aponta para o local após o último elemento em um multiset . |
equal_range |
Retorna um par de iteradores. O primeiro iterador no par aponta para o primeiro elemento em um multiset com uma chave que é maior que uma chave especificada. O segundo iterador no par aponta para o primeiro elemento no multiset com uma chave que é igual ou maior que a chave. |
erase |
Remove um elemento ou um intervalo de elementos em um multiset das posições especificadas ou remove elementos que correspondem a uma chave especificada. |
find |
Retorna um iterador que aponta para o primeiro local de um elemento em um multiset que tem uma chave igual a uma chave especificada. |
get_allocator |
Retorna uma cópia do objeto allocator que é usada para construir o multiset . |
insert |
Insere um elemento ou um intervalo de elementos em um multiset . |
key_comp |
Fornece um objeto de função que pode comparar duas chaves de classificação para determinar a ordem relativa de dois elementos no multiset . |
lower_bound |
Retorna um iterador para o primeiro elemento em um multiset com uma chave que é igual ou maior que uma chave especificada. |
max_size |
Retorna o comprimento máximo do multiset . |
rbegin |
Retorna um iterador que aponta para o primeiro elemento em um multiset invertido. |
rend |
Retorna um iterador que aponta para o local após o último elemento em um multiset invertido. |
size |
Retorna o número de elementos em um multiset . |
swap |
Troca os elementos de dois multiset s. |
upper_bound |
Retorna um iterador para o primeiro elemento em um multiset com uma chave que é maior que uma chave especificada. |
value_comp |
Recupera uma cópia do objeto de comparação que é usada para ordenar valores de elemento em um multiset . |
Operadores
Operador | Descrição |
---|---|
operator= |
Substitui os elementos de um multiset por uma cópia de outro multiset . |
Requisitos
Cabeçalho: <set>
Namespace: std
multiset::allocator_type
Um tipo que representa a classe allocator do objeto multiset
typedef Allocator allocator_type;
Comentários
allocator_type
é um sinônimo do parâmetro de modelo Allocator
.
Para obter mais informações sobre Allocator
, consulte a seção Comentários do tópico Classe multiset.
Exemplo
Veja o exemplo de get_allocator
para obter um exemplo que usa allocator_type
multiset::begin
Retorna um iterador que trata o primeiro elemento no multiset
.
const_iterator begin() const;
iterator begin();
Valor de retorno
Um iterador bidirecional de endereçamento do primeiro elemento na multiset
ou o local após uma multiset vazia.
Exemplo
// 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
Retorna um iterador const
que trata o primeiro elemento no intervalo.
const_iterator cbegin() const;
Valor de retorno
Um iterador de acesso bidirecional const
que aponta o primeiro elemento do intervalo ou o local logo após o fim de um intervalo vazio (para um intervalo vazio, cbegin() == cend()
).
Comentários
Com o valor retornado de cbegin
, os elementos no intervalo não podem ser modificados.
Você pode usar essa função membro no lugar da função membro begin()
, de modo a garantir que o valor de retorno seja const_iterator
. Normalmente, é usada juntamente com a palavra-chave de dedução de tipo auto, conforme mostrado no exemplo a seguir. No exemplo, considere Container
como um contêiner modificável (não const
) de qualquer tipo, que dá suporte para begin()
e cbegin()
.
auto i1 = Container.begin();
// i1 is Container<T>::iterator
auto i2 = Container.cbegin();
// i2 is Container<T>::const_iterator
multiset::cend
Retorna um iterador const
que trata o local logo após o último elemento em um intervalo.
const_iterator cend() const;
Valor de retorno
Um iterador de acesso bidirecional const
que aponta para além do fim do intervalo.
Comentários
cend
é usado para testar se um iterador passou do fim de seu intervalo.
Você pode usar essa função membro no lugar da função membro end()
, de modo a garantir que o valor de retorno seja const_iterator
. Normalmente, é usada juntamente com a palavra-chave de dedução de tipo auto, conforme mostrado no exemplo a seguir. No exemplo, considere Container
como um contêiner modificável (não const
) de qualquer tipo, que dá suporte para end()
e cend()
.
auto i1 = Container.end();
// i1 is Container<T>::iterator
auto i2 = Container.cend();
// i2 is Container<T>::const_iterator
O valor retornado por cend
não deve ser desreferenciado.
multiset::clear
Apaga todos os elementos de um multiset
.
void clear();
Exemplo
// 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
Um tipo que fornece um iterador bidirecional que pode ler um elemento const
no multiset
.
typedef implementation-defined const_iterator;
Comentários
Um tipo const_iterator
não pode ser usado para modificar o valor de um elemento.
Exemplo
Veja o exemplo de begin
para obter um exemplo que usa const_iterator
.
multiset::const_pointer
Um tipo que fornece um ponteiro para um elemento const
em um multiset
.
typedef typename allocator_type::const_pointer const_pointer;
Comentários
Um tipo const_pointer
não pode ser usado para modificar o valor de um elemento.
Na maioria dos casos, um iterador deve ser usado para acessar os elementos em um objeto multiset
.
multiset::const_reference
Um tipo que fornece uma referência para um elemento const
armazenado em um multiset
para ler e realizar operações const
.
typedef typename allocator_type::const_reference const_reference;
Exemplo
// 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
Um tipo que fornece um iterador bidirecional que pode ler qualquer elemento const
no multiset
.
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Comentários
Um tipo const_reverse_iterator
não pode modificar o valor de um elemento e é usado para iterar o multiset
invertido.
Exemplo
Veja o exemplo de rend
que demonstra como declarar e usar o const_reverse_iterator
.
multiset::contains
Verifique se há um elemento com a chave especificada no multiset
.
bool contains(const Key& key) const;
template<class K> bool contains(const K& key) const;
Parâmetros
K
Tipo da chave.
key
O valor-chave do elemento a ser procurado.
Valor de retorno
true
se o elemento for encontrado no contêiner; caso contrário, será false
.
Comentários
contains()
é novo em C++20. Para usá-lo, especifique a opção do compilador /std:c++20 ou posterior.
template<class K> bool contains(const K& key) const
só participará da resolução de sobrecarga se key_compare
for transparente. Confira Pesquisa heterogênea em contêineres associativos para obter mais informações.
Exemplo
// 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
Retorna o número de elementos em um multiset
cuja chave corresponde a uma chave especificada pelo parâmetro.
size_type count(const Key& key) const;
Parâmetros
key
A chave dos elementos serem correspondidos pelo multiset
.
Valor de retorno
O número de elementos na multiset
cuja chave de classificação corresponde à chave de parâmetro.
Comentários
A função membro retorna o número de elementos x no intervalo
[ lower_bound(key
), upper_bound(key
) )
Exemplo
O exemplo a seguir demonstra o uso da função membro multiset
::count.
// multiset_count.cpp
// compile with: /EHsc
#include <set>
#include <iostream>
int main()
{
using namespace std;
multiset<int> ms1;
multiset<int>::size_type i;
ms1.insert(1);
ms1.insert(1);
ms1.insert(2);
// Elements don't need to be unique in multiset,
// so duplicates are allowed and counted.
i = ms1.count(1);
cout << "The number of elements in ms1 with a sort key of 1 is: "
<< i << "." << endl;
i = ms1.count(2);
cout << "The number of elements in ms1 with a sort key of 2 is: "
<< i << "." << endl;
i = ms1.count(3);
cout << "The number of elements in ms1 with a sort key of 3 is: "
<< i << "." << endl;
}
The number of elements in ms1 with a sort key of 1 is: 2.
The number of elements in ms1 with a sort key of 2 is: 1.
The number of elements in ms1 with a sort key of 3 is: 0.
multiset::crbegin
Retorna um iterador const que trata o primeiro elemento em um multiset invertido.
const_reverse_iterator crbegin() const;
Valor de retorno
Um iterador bidirecional invertido const que trata do primeiro elemento em um multiset invertido ou que trata do que foi o último elemento do multiset não invertido.
Comentários
crbegin
é usado com um multiset invertido, assim como begin é usado com uma multiset
.
Com o valor retornado crbegin
, o objeto multiset
não pode ser modificado.
crbegin
pode ser usado para iterar em um multiset
no sentido inverso.
Exemplo
// 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
Retorna um iterador const que trata o local após o último elemento em um multiset invertido.
const_reverse_iterator crend() const;
Valor de retorno
Um iterador bidirecional inverso const que trata da localização que vem após o último elemento em uma multiset invertida (o local que precedeu o primeiro elemento na multiset não invertida).
Comentários
crend
é usado com uma multiset invertida, assim como end
é usado com uma multiset
.
Com o valor retornado crend
, o objeto multiset
não pode ser modificado.
crend
pode ser usado para testar se um iterador inverso alcançou o final de sua multiset
.
O valor retornado por crend
não deve ser desreferenciado.
Exemplo
// 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
Um tipo de inteiro com sinal que pode ser usado para representar o número de elementos de um multiset
em um intervalo entre os elementos apontado pelos iteradores.
typedef typename allocator_type::difference_type difference_type;
Comentários
difference_type
é o tipo retornado ao subtrair ou incrementar por meio de iteradores do contêiner. difference_type
geralmente é usado para representar o número de elementos no intervalo [first
, last
) entre os iteradores first
e last
, inclui o elemento apontado por first
e o intervalo de elementos até, mas sem incluir, o elemento apontado por last
.
Embora difference_type
esteja disponível para todos os iteradores que atendem aos requisitos de um iterador de entrada, que inclui a classe de iteradores bidirecionais com suporte dos contêineres reversíveis, como um conjunto, a subtração entre iteradores só tem suporte dos iteradores de acesso aleatório fornecidos por um contêiner de acesso aleatório, como um vetor.
Exemplo
// 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
Insere um elemento criado no local (nenhuma operação de cópia ou movimentação é realizada), com uma dica de posicionamento.
template <class... Args>
iterator emplace(Args&&... args);
Parâmetros
args
Os argumentos encaminhados para construir um elemento a ser inserido na multiset
.
Valor de retorno
Um iterador para o elemento recém-inserido.
Comentários
Nenhuma referência a elementos de contêiner é invalidada por essa função, mas ela pode invalidar todos os iteradores no contêiner.
Durante o posicionamento, se uma exceção for lançada, o estado do contêiner não será modificado.
Exemplo
// 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
Insere um elemento criado no local (nenhuma operação de cópia ou movimentação é realizada), com uma dica de posicionamento.
template <class... Args>
iterator emplace_hint(
const_iterator where,
Args&&... args);
Parâmetros
args
Os argumentos encaminhados para construir um elemento a ser inserido na multiset
.
where
O local a partir do qual se começa a procurar pelo ponto de inserção correto. (Se esse ponto preceder imediatamente where
, a inserção poderá ocorrer em um tempo constante amortizado, em vez de no tempo logarítmico.)
Valor de retorno
Um iterador para o elemento recém-inserido.
Comentários
Nenhuma referência a elementos de contêiner é invalidada por essa função, mas ela pode invalidar todos os iteradores no contêiner.
Durante o posicionamento, se uma exceção for lançada, o estado do contêiner não será modificado.
Para obter um exemplo de código, consulte set::emplace_hint
.
multiset::empty
Testa se multiset
está vazio.
bool empty() const;
Valor de retorno
true
se multiset
for vazio; false
se multiset
não for vazio.
Exemplo
// 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
Retorna o iterador que ultrapassa o fim.
const_iterator end() const;
iterator end();
Valor de retorno
O iterador que ultrapassa o fim. Se o multiset
estiver vazio, então multiset::end() == multiset::begin()
.
Comentários
end
é usado para testar se um iterador passou do fim de seu multiset.
O valor retornado por end
não deve ser desreferenciado.
Para obter um exemplo de código, consulte multiset::find
.
multiset::equal_range
Retorna um par de iteradores, respectivamente, para o primeiro elemento em um multiset
com uma chave que é maior do que uma chave especificada e para o primeiro elemento no multiset
com uma chave igual ou maior que a chave.
pair <const_iterator, const_iterator> equal_range (const Key& key) const;
pair <iterator, iterator> equal_range (const Key& key);
Parâmetros
key
A chave do argumento a ser comparada com a chave de classificação de um elemento do multiset
que está sendo pesquisado.
Valor de retorno
Um par de iteradores em que o primeiro é o lower_bound
da chave e o segundo é o upper_bound
da chave.
Para acessar o primeiro iterador de um par pr
retornado pela função membro, use pr
. first
, e para desreferenciar o iterador de limite inferior, use *( pr
. first
). Para acessar o segundo iterador de um par pr
retornado pela função membro, use pr
. second
, e para desreferenciar o iterador de limite superior, use *( pr
. second
).
Exemplo
// 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
Remove um elemento ou um intervalo de elementos em um multiset
das posições especificadas ou remove elementos que correspondem a uma chave especificada.
iterator erase(
const_iterator Where);
iterator erase(
const_iterator First,
const_iterator Last);
size_type erase(
const key_type& Key);
Parâmetros
Where
A posição do elemento a ser removido.
First
A posição do primeiro elemento a ser removido.
Last
A posição logo após o último elemento a ser removido.
key
O valor de chave dos elementos a serem removidos.
Valor de retorno
Para as duas primeiras funções membro, um iterador bidirecional que designa o primeiro elemento restante além de quaisquer elementos removidos ou um elemento que será o final do multiset
, se esse elemento não existir.
Para a terceira função membro, ele retorna o número de elementos que foram removidos do multiset
.
Comentários
Para obter um exemplo de código, consulte set::erase
.
multiset::find
Retorna um iterador que aponta para o local de um elemento em um multiset
com uma chave equivalente a uma chave especificada.
iterator find(const Key& key);
const_iterator find(const Key& key) const;
Parâmetros
key
O valor da chave a ser correspondido pela chave de classificação de um elemento do multiset
que está sendo pesquisado.
Valor de retorno
Um iterador que se refere ao local de um elemento com uma chave especificada ou o local que substitui o último elemento no conjunto multiset
( multiset::end()
) se nenhuma correspondência for encontrada para a chave.
Comentários
A função membro retorna um iterador que se refere a um elemento no multiset
cuja chave é equivalente ao argumento key
em um predicado binário que induz uma ordenação com base em uma relação de comparação menor.
Se o valor retornado de find
for atribuído a um const_iterator
, o objeto multiset
não poderá ser modificado. Se o valor retornado de find
for atribuído a um iterator
, o objeto multiset
poderá ser modificado
Exemplo
// 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
Retorna uma cópia do objeto alocador usado para construir o multiset
.
allocator_type get_allocator() const;
Valor de retorno
O alocador usado pelo multiset
.
Comentários
Alocadores para a classe multiset
especificam como a classe gerencia o armazenamento. Os alocadores padrão fornecidos com as classes de contêiner da Biblioteca Padrão C++ são suficientes para a maioria das necessidades de programação. Gravando e usando sua própria classe de alocador é um tópico avançado do C++.
Exemplo
// 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
Insere um elemento ou um intervalo de elementos em um multiset
.
// (1) single element
pair<iterator, bool> insert(
const value_type& Val);
// (2) single element, perfect forwarded
template <class ValTy>
pair<iterator, bool>
insert(
ValTy&& Val);
// (3) single element with hint
iterator insert(
const_iterator Where,
const value_type& Val);
// (4) single element, perfect forwarded, with hint
template <class ValTy>
iterator insert(
const_iterator Where,
ValTy&& Val);
// (5) range
template <class InputIterator>
void insert(
InputIterator First,
InputIterator Last);
// (6) initializer list
void insert(
initializer_list<value_type>
IList);
Parâmetros
Val
O valor de um elemento a ser inserido em multiset
.
Where
O local a partir do qual se começa a procurar pelo ponto de inserção correto. (Se esse ponto preceder imediatamente Where
, a inserção poderá ocorrer em um tempo constante amortizado, em vez de no tempo logarítmico.)
ValTy
O parâmetro de modelo que especifica o tipo de argumento que o multiset
pode usar para construir um elemento de value_type
e encaminhar perfeitamente Val
como um argumento.
First
A posição do primeiro elemento a ser copiado.
Last
A posição imediatamente após o último elemento a ser copiado.
1
Argumento da função de modelo que atende aos requisitos de um input_iterator_tag
que aponta para elementos de um tipo que pode ser usado para construir 1 objetos.
IList
O initializer_list
para o qual copiar os elementos.
Valor de retorno
As funções do membro de inserção do elemento único, (1) e (2), retornam um iterador para a posição em que o novo elemento foi inserido em multiset
.
As funções membro de inserção de elemento único, (3) e (4), retornam um iterador para a posição em que o novo elemento foi inserido na multiset
.
Comentários
Nenhum ponteiro ou referência é invalidado por esta função, mas ela pode invalidar todos os iteradores para o contêiner.
Durante a inserção de apenas um elemento, se uma exceção for lançada, o estado do contêiner não será modificado. Durante a inserção de vários elementos, se uma exceção for lançada, o contêiner será deixado em um estado não especificado, mas válido.
O value_type
de um contêiner é um typedef que pertence ao contêiner e, para o set multiset<V>::value_type
, é tipo const V
.
A função do membro de intervalo (5) insere a sequência de valores de elemento em um multiset
que corresponde a cada elemento tratado por um iterador no intervalo [First, Last)
; portanto, Last
não é inserido. A função de membro do contêiner end()
refere-se à posição logo após o último elemento no contêiner, por exemplo, a instrução s.insert(v.begin(), v.end());
insere todos os elementos de v
em s
.
A função membro da lista do inicializador (6) usa um initializer_list
para copiar elementos para o multiset
.
Para inserir um elemento construído no lugar (ou seja, sem a realização de operação de cópia ou movimentação), confira multiset::emplace
e multiset::emplace_hint
.
Exemplo
// 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
Um tipo que fornece um iterador bidirecional constante que pode ler qualquer elemento em uma multiset
.
typedef implementation-defined iterator;
Exemplo
Veja o exemplo de begin para obter um exemplo de como declarar e usar um iterator
.
multiset::key_comp
Recupera uma cópia do objeto de comparação usada para ordenar chaves em um multiset
.
key_compare key_comp() const;
Valor de retorno
Retorna o objeto de função que uma multiset
usa para ordenar seus elementos, que é o parâmetro de modelo Compare
.
Para obter mais informações sobre Compare
, consulte a seção Comentários do tópico Classe multiset.
Comentários
O objeto armazenado define a função membro:
operador bool( const Key& x, const Key& y);
que retornará true se x preceder estritamente y na ordem de classificação.
Ambos key_compare
e value_compare
são sinônimos do parâmetro de modelo Compare
. Os dois tipos são fornecidos para as classes set e multiset, em que são idênticos, para compatibilidade com as classes map e multimap, em que são distintos.
Exemplo
// 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
Um tipo que fornece um objeto de função que pode comparar duas chaves de classificação para determinar a ordem relativa de dois elementos no multiset
.
typedef Compare key_compare;
Comentários
key_compare
é um sinônimo do parâmetro de modelo Compare
.
Para obter mais informações sobre Compare
, consulte a seção Comentários do tópico multiset
Classe .
Exemplo
Veja o exemplo de key_comp
que demonstra como declarar e usar key_compare
.
multiset::key_type
Um tipo que fornece um objeto de função que pode comparar chaves de classificação para determinar a ordem relativa de dois elementos na multiset
.
typedef Key key_type;
Comentários
key_type
é um sinônimo do parâmetro de modelo Key
.
Para obter mais informações sobre Key
, consulte a seção Comentários do tópico multiset
Classe .
Exemplo
Veja o exemplo de value_type
que demonstra como declarar e usar key_type
.
multiset::lower_bound
Retorna um iterador para o primeiro elemento em um multiset
com uma chave que é igual ou maior que uma chave especificada.
const_iterator lower_bound(const Key& key) const;
iterator lower_bound(const Key& key);
Parâmetros
key
A chave do argumento a ser comparada com a chave de classificação de um elemento do multiset
que está sendo pesquisado.
Valor de retorno
Um iterator
ou const_iterator
que tratará a localização de um elemento em uma multiset
com uma chave, que é igual ou maior que a chave de argumento ou que tratará o local após o último elemento na multiset
se nenhuma correspondência for encontrada para a chave.
Exemplo
// 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
Retorna o comprimento máximo do multiset
.
size_type max_size() const;
Valor de retorno
O comprimento máximo possível da multiset
.
Exemplo
// 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
Constrói um multiset
que está vazio ou que é uma cópia de todo ou parte de algum outro multiset
.
multiset();
explicit multiset (
const Compare& Comp);
multiset (
const Compare& Comp,
const Allocator& Al);
multiset(
const multiset& Right);
multiset(
multiset&& Right);
multiset(
initializer_list<Type> IList);
multiset(
initializer_list<Type> IList,
const Compare& Comp);
multiset(
initializer_list<Type> IList,
const Compare& Comp,
const Allocator& Al);
template <class InputIterator>
multiset (
InputIterator First,
InputIterator Last);
template <class InputIterator>
multiset (
InputIterator First,
InputIterator Last,
const Compare& Comp);
template <class InputIterator>
multiset (
InputIterator First,
InputIterator Last,
const Compare& Comp,
const Allocator& Al);
Parâmetros
Al
A classe do alocador de armazenamento a ser usado neste objeto multiset, cujo padrão é Allocator
.
Comp
A função de comparação do tipo const Compare
usada para ordenar os elementos no multiset
, cujo padrão é Compare
.
Right
a multiset
da qual a multiset criada deve ser uma cópia.
First
A posição do primeiro elemento no intervalo de elementos a serem copiados.
Last
A posição do primeiro elemento além do intervalo de elementos a serem copiados.
IList
O initializer_list
para o qual copiar os elementos.
Comentários
Todos os construtores armazenam um tipo de objeto de alocador que gerencia o armazenamento de memória para multiset
e que, posteriormente, pode ser retornado ao chamar get_allocator
. O parâmetro do alocador muitas vezes é omitido nas declarações de classe e nas macros de pré-processamento usadas para substituir os alocadores alternativos.
Todos os construtores inicializam seu multiset.
Todos os construtores armazenam um objeto de função do tipo Compare, que é usado para estabelecer uma ordem entre as chaves da multiset
e que posteriormente pode ser retornado ao chamar key_comp
.
O primeiro dos três construtores especifica uma multiset inicial vazia, o segundo especifica o tipo de função de comparação (Comp
) a ser usada para estabelecer a ordem dos elementos e o terceiro especifica explicitamente o tipo de alocador (Al
) a ser usado. A palavra-chave explicit
suprime determinados tipos de conversão de tipo automática.
O quarto construtor especifica uma cópia do multiset
Right
.
O quinto construtor especifica uma cópia da multiset
movendo Right
.
O sexto, sétimo e oitavo construtores especificam um initializer_list da qual os elementos são copiados.
Os próximos três construtores copiam o intervalo [First, Last)
de uma multiset
com clareza crescente para especificar o tipo de função de comparação e do alocador.
Exemplo
// 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=
Substitui os elementos desse multiset
usando os elementos de outro multiset
.
multiset& operator=(const multiset& right);
multiset& operator=(multiset&& right);
Parâmetros
Right
O multiset
do qual os elementos são copiados ou movidos.
Comentários
operator=
copia ou move os elementos em Right
nesse multiset
, dependendo do tipo de referência (lvalue ou rvalue) usado. Elementos que estão neste multiset
antes de execuções operator=
são descartados.
Exemplo
// 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
Um tipo que fornece um ponteiro para um elemento em um multiset
.
typedef typename allocator_type::pointer pointer;
Comentários
Um tipo de pointer
pode ser usado para modificar o valor de um elemento.
Na maioria dos casos, um iterador deve ser usado para acessar os elementos em um objeto multiset
.
multiset::rbegin
Retorna um iterador que trata o primeiro elemento em um multiset inverso.
const_reverse_iterator rbegin() const;
reverse_iterator rbegin();
Valor de retorno
Um iterador bidirecional constante invertido que aborda o primeiro elemento em uma multiset
invertida ou abordando o que foi o último elemento na multiset
não invertida.
Comentários
rbegin
é usado com uma multiset
invertida, assim como rbegin é usado com uma multiset
.
Se o valor retornado de rbegin
for atribuído a uma const_reverse_iterator
, o objeto multiset
não poderá ser modificado. Se o valor retornado de rbegin
for atribuído a uma reverse_iterator
, o objeto multiset
não poderá ser modificado.
rbegin
pode ser usado para iterar em um multiset
no sentido inverso.
Exemplo
// 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
Um tipo que fornece uma referência a um elemento armazenado em um multiset
.
typedef typename allocator_type::reference reference;
Exemplo
// 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
Retorna um iterador que trata o local após o último elemento em um multiset
invertido.
const_reverse_iterator rend() const;
reverse_iterator rend();
Valor de retorno
Um iterador bidirecional inverso que aborda a localização que vem após o último elemento em uma multiset
invertida (o local que precedeu o primeiro elemento no multiset
não invertido).
Comentários
rend
é usado com uma multiset invertida, assim como end
é usado com uma multiset
.
Se o valor retornado de rend
for atribuído a uma const_reverse_iterator
, o objeto multiset
não poderá ser modificado. Se o valor retornado de rend
for atribuído a uma reverse_iterator
, o objeto multiset
não poderá ser modificado.
rend
pode ser usado para testar se um iterador inverso alcançou o final de seu multiset.
O valor retornado por rend
não deve ser desreferenciado.
Exemplo
// 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
Um tipo que fornece um iterador bidirecional que pode ler ou modificar um elemento em um multiset invertido.
typedef std::reverse_iterator<iterator> reverse_iterator;
Comentários
Um tipo reverse_iterator
é usado para iterar a multiset
em ordem inversa.
Exemplo
Confira rbegin
, para ver um exemplo de como declarar e usar reverse_iterator
.
multiset::size
Retorna o número de elementos no multiset
.
size_type size() const;
Valor de retorno
O comprimento atual do multiset
.
Exemplo
// 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
Um tipo de inteiro sem sinal que pode representar o número de elementos em um multiset
.
typedef typename allocator_type::size_type size_type;
Exemplo
Confira size
, para ver um exemplo de como declarar e usar size_type
multiset::swap
Troca os elementos de dois multisets.
void swap(
multiset<Key, Compare, Allocator>& right);
Parâmetros
Right
O multiset do argumento que fornece os elementos a serem trocados com o multiset de destino.
Comentários
A função membro não invalida referências, ponteiros ou iteradores que designam elementos nos dois multisets cujos elementos são trocados.
Exemplo
// 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
Retorna um iterador para o primeiro elemento em um multiset
com uma chave que é maior que uma chave especificada.
const_iterator upper_bound(const Key& key) const;
iterator upper_bound(const Key& key);
Parâmetros
key
A chave do argumento a ser comparada com a chave de classificação de um elemento do multiset
que está sendo pesquisado.
Valor de retorno
Um iterator ou const_iterator
que tratará a localização de um elemento em uma multiset
com uma chave, que é maior que a chave de argumento ou que tratará o local após o último elemento na multiset
se nenhuma correspondência for encontrada para a chave.
Exemplo
// 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
Recupera uma cópia do objeto de comparação usado para ordenar valores de elemento em um multiset
.
value_compare value_comp() const;
Valor de retorno
Retorna o objeto de função que uma multiset
usa para ordenar seus elementos, que é o parâmetro de modelo Compare
.
Para obter mais informações sobre Compare
, consulte a seção Comentários do tópico multiset
Classe .
Comentários
O objeto armazenado define a função membro:
bool operator( const Key&_xVal
, const Key&_yVal
);
que retornará true se _xVal
preceder e não for igual a _yVal
na ordem de classificação.
Ambos key_compare
e value_compare
são sinônimos do parâmetro de modelo Compare
. Os dois tipos são fornecidos para as classes set e multiset
, em que são idênticos, para compatibilidade com as classes map e multimap
, em que são distintos.
Exemplo
// 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
O tipo que fornece um objeto de função que pode comparar duas chaves de classificação para determinar sua ordem relativa na multiset
.
typedef key_compare value_compare;
Comentários
value_compare
é um sinônimo do parâmetro de modelo Compare
.
Ambos key_compare
e value_compare
são sinônimos do parâmetro de modelo Compare
. Os dois tipos são fornecidos para as classes set e multiset
, em que são idênticos, para compatibilidade com as classes map e multimap
, em que são distintos.
Para obter mais informações sobre Compare
, consulte a seção Comentários do tópico Classe multiset.
Exemplo
Veja o exemplo de value_comp
que demonstra como declarar e usar value_compare
.
multiset::value_type
Um tipo que descreve um objeto armazenado como um elemento de uma multiset
em sua capacidade como um valor.
typedef Key value_type;
Comentários
value_type
é um sinônimo do parâmetro de modelo Key
.
Ambos key_type
e value_type
são sinônimos do parâmetro de modelo Key
. Os dois tipos são fornecidos para as classes set e multiset, em que são idênticos, para compatibilidade com as classes map e multimap, em que são distintos.
Para obter mais informações sobre Key
, consulte a seção Comentários do tópico.
Exemplo
// 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.
Confira também
Contêineres
Acesso Thread-Safe na Biblioteca Padrão C++
Referência da biblioteca padrão C++