Partilhar via


multiset Classe

A classe multiset C++ Standard Library é usada para o armazenamento e recuperação de dados de uma coleção na qual os valores dos elementos contidos não precisam ser exclusivos e na qual eles servem como os valores-chave de acordo com os quais os dados são ordenados automaticamente. O valor-chave de um elemento em a 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 menos<Key> é o valor padrão.

Em C++14, você pode habilitar a pesquisa heterogênea especificando o predicado std::less<> ou std::greater<> que não tem parâmetros de tipo. Consulte Pesquisa heterogênea em contêineres associativos para obter mais informações.

Allocator
O tipo que representa o objeto alocador armazenado que encapsula detalhes sobre a alocação e desalocação de memória do multiset. O valor predefinido é allocator<Key>.

Observações

A classe C++ Standard Library multiset é:

  • Um contêiner associativo, que é um contêiner de tamanho variável que suporta a recuperação eficiente de valores de elemento com base em um valor de chave associado.

  • Reversível, porque fornece iteradores bidirecionais para acessar seus elementos.

  • Classificado, porque seus elementos são ordenados por valores-chave dentro do contêiner de acordo com uma função de comparação especificada.

  • Múltiplo no sentido de que seus elementos não precisam ter chaves exclusivas, de modo que um valor de chave pode ter muitos valores de elemento associados a ele.

  • Um contêiner associativo simples porque seus valores de elemento são seus valores-chave.

  • Um modelo de classe, porque a funcionalidade que ele fornece é genérica e, portanto, independente do tipo específico de dados contidos como elementos. O tipo de dados a ser usado é, em vez disso, especificado como um parâmetro no modelo de classe, juntamente com a função de comparação e o alocador.

O iterador fornecido pela multiset classe é um iterador bidirecional, mas o membro da classe funciona insert e multiset tem versões que tomam como parâmetros de modelo um iterador de entrada mais fraco, cujos requisitos de funcionalidade são mais mínimos do que os garantidos pela classe de iteradores bidirecionais. Os diferentes conceitos de iterador 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 trabalham com eles devem limitar suas suposições aos requisitos fornecidos por esse tipo de iterador. Pode-se supor que um iterador de entrada pode ser desreferenciado para se referir a algum objeto e que ele pode ser incrementado para o próximo iterador na sequência. Este é um conjunto mínimo de funcionalidades, mas é suficiente para ser capaz de falar significativamente sobre uma gama de iteradores [ First, Last) no contexto das funções de membro da classe.

A escolha do tipo de contentor deve basear-se, em geral, no tipo de pesquisa e inserção exigido pela aplicação. Os contêineres associativos são otimizados para as operações de pesquisa, inserção e remoção. As funções de membro que suportam explicitamente essas operações são eficientes, fazendo-as em um tempo que é, em média, proporcional ao logaritmo do número de elementos no contêiner. A inserção de elementos não invalida nenhum iterador e a remoção de elementos invalida apenas os iteradores que apontaram para os elementos removidos.

O multiset deve ser o recipiente associativo de escolha quando as condições que associam os valores com suas chaves são satisfeitas pelo aplicativo. Os elementos de um multiset podem ser múltiplos e servir como suas próprias chaves de classificação, portanto, as chaves não são exclusivas. Um modelo para este tipo de estrutura é uma lista ordenada de, digamos, palavras em que as palavras podem ocorrer mais de uma vez. Se várias ocorrências das palavras não tivessem sido permitidas, então um conjunto teria sido a estrutura de contêiner apropriada. Se 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 únicas, então um multimap seria o recipiente de escolha.

O multiset ordena a sequência que ele controla chamando um objeto de função armazenado do tipo Compare. Este objeto armazenado é uma função de comparação que pode ser acessada chamando a função key_compde membro. Em geral, os elementos precisam ser apenas menos do que comparáveis para estabelecer essa ordem: de modo que, dados quaisquer dois elementos, pode-se determinar que eles são equivalentes (no sentido de que nenhum é menor que o outro) ou que um é menor que o outro. Isso resulta em uma ordenação entre os elementos não equivalentes. Em uma nota mais técnica, a função de comparação é um predicado binário que induz uma ordenação fraca estrita 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 de retorno de true ou false. Uma ordenação imposta a um conjunto é uma ordenação fraca estrita se o predicado binário é irreflexivo, antisimétrico e transitivo e se a equivalência é transitiva, onde dois objetos x e y são definidos como equivalentes quando f(x,y) e f(y,x) são falsos. Se a condição mais forte de igualdade entre chaves substitui a de equivalência, então a ordenação torna-se total (no sentido de que todos os elementos são ordenados uns em relação aos outros) e as chaves combinadas serão indiscerníveis umas das outras.

Em C++14, você pode habilitar a pesquisa heterogênea especificando o predicado std::less<> ou std::greater<> que não tem parâmetros de tipo. Consulte Pesquisa heterogênea em contêineres associativos para obter mais informações.

Construtores

Construtor Descrição
multiconjunto Constrói um multiset que está vazio ou que é uma cópia de todo ou parte de um especificado multiset.

Typedefs (definições de tipos)

Nome do tipo Descrição
allocator_type Um typedef para a allocator classe do multiset objeto.
const_iterator Um typedef para um iterador bidirecional que pode ler um const elemento no multiset.
const_pointer Um typedef para um ponteiro para um const elemento em um multisetarquivo .
const_reference Um typedef para uma referência a um const elemento armazenado em um multiset para operações de leitura e execução const .
const_reverse_iterator Um typedef para um iterador bidirecional que pode ler qualquer const elemento no multiset.
difference_type Um inteiro typedef assinado para o número de elementos de a multiset em um intervalo entre elementos apontados por iteradores.
iterator Um typedef para um iterador bidirecional que pode ler ou modificar qualquer elemento em um multisetarquivo .
key_compare Um typedef para um objeto de função que pode comparar duas teclas para determinar a ordem relativa de dois elementos no multiset.
key_type Um typedef para 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 para um ponteiro para um elemento em um multisetarquivo .
reference Um typedef para uma referência a um elemento armazenado em um multisetarquivo .
reverse_iterator Um typedef para um iterador bidirecional que pode ler ou modificar um elemento em um multisetarquivo .
size_type Um tipo inteiro não assinado que pode representar o número de elementos em um multisetarquivo .
value_compare O typedef para 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 como 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 aborda o primeiro elemento no multiset.
cend Retorna um iterador const que aborda o local que sucede o último elemento em um multisetarquivo .
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 uma multiset cuja chave corresponde à chave especificada como parâmetro.
crbegin Retorna um iterador const endereçando o primeiro elemento em um arquivo multiset.
crend Retorna um iterador const que aborda o local que sucede o último elemento em um arquivo multiset.
emplace Insere um elemento construído no local em um multisetarquivo .
emplace_hint Insere um elemento construído no lugar em um multiset, com uma dica de posicionamento.
empty Testa se um multiset está vazio.
end Retorna um iterador que aponta para o local após o último elemento em um multisetarquivo .
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 do 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 de 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 é usado para construir o multiset.
insert Insere um elemento ou um intervalo de elementos em um multisetarquivo .
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 do que uma chave especificada.
max_size Devolve o comprimento máximo da multiset.
rbegin Retorna um iterador que aponta para o primeiro elemento em um arquivo multiset.
rend Retorna um iterador que aponta para o local que sucede o último elemento em um arquivo multiset.
size Devolve o número de elementos em um multisetarquivo .
swap Troca os elementos de dois multisets.
upper_bound Retorna um iterador para o primeiro elemento em um multiset com uma chave que é maior do que uma chave especificada.
value_comp Recupera uma cópia do objeto de comparação usado para ordenar valores de elementos em um multisetarquivo .

Operadores

Operador Descrição
operator= Substitui os elementos de um multiset por uma cópia de outro multiset.

Requerimentos

Cabeçalho:<set>

Espaço de nomes: std

multiset::allocator_type

Um tipo que representa a classe de alocador para o multiset objeto

typedef Allocator allocator_type;

Observações

allocator_type é sinônimo do parâmetro de modelo Allocator.

Para obter mais informações sobre Allocatoro , consulte a seção Comentários do tópico Classe multiset .

Exemplo

Veja o exemplo para get_allocator um exemplo usando allocator_type

multiset::begin

Retorna um iterador endereçando o primeiro elemento no multiset.

const_iterator begin() const;

iterator begin();

Valor de retorno

Um iterador bidirecional endereçando o primeiro elemento no multiset ou o local que sucede um multiconjunto vazio.

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 aborda o primeiro elemento no intervalo.

const_iterator cbegin() const;

Valor de retorno

Um const iterador de acesso bidirecional que aponta para o primeiro elemento do intervalo, ou o local logo após o final de um intervalo vazio (para um intervalo vazio, cbegin() == cend()).

Observações

Com o valor de retorno de cbegin, os elementos no intervalo não podem ser modificados.

Você pode usar essa função de membro no lugar da função de membro begin() para garantir que o valor de retorno seja const_iterator. Normalmente, ele é usado em conjunto com a palavra-chave de dedução de tipo automático , conforme mostrado no exemplo a seguir. No exemplo, considere Container como um recipiente modificável (não const) de qualquer tipo que suporte 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 aborda o local logo após o último elemento de um intervalo.

const_iterator cend() const;

Valor de retorno

Um const iterador de acesso bidirecional que aponta para além do final do intervalo.

Observações

cend é usado para testar se um iterador passou no final de seu intervalo.

Você pode usar essa função de membro no lugar da função de membro end() para garantir que o valor de retorno seja const_iterator. Normalmente, ele é usado em conjunto com a palavra-chave de dedução de tipo automático , conforme mostrado no exemplo a seguir. No exemplo, considere Container como um recipiente modificável (não const) de qualquer tipo que suporte 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 const elemento no multiset.

typedef implementation-defined const_iterator;

Observações

Um tipo const_iterator não pode ser usado para modificar o valor de um elemento.

Exemplo

Veja o exemplo para begin obter um exemplo usando const_iterator.

multiset::const_pointer

Um tipo que fornece um ponteiro para um const elemento em um multisetarquivo .

typedef typename allocator_type::const_pointer const_pointer;

Observações

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 multiset objeto.

multiset::const_reference

Um tipo que fornece uma referência a um const elemento armazenado em um multiset para ler e fazer const operações.

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 const elemento no multiset.

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

Observações

Um tipo const_reverse_iterator não pode modificar o valor de um elemento e é usado para iterar através do multiset inversamente.

Exemplo

Veja o exemplo para rend obter um exemplo de 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
O tipo da chave.

key
O valor-chave do elemento a procurar.

Valor de retorno

true se o elemento for encontrado no recipiente; false o contrário.

Observações

contains() é novo no C++20. Para usá-lo, especifique a opção de compilador /std:c++20 ou posterior.

template<class K> bool contains(const K& key) const só participa na resolução de sobrecarga se key_compare for transparente. Consulte Pesquisa heterogênea em contêineres associativos para obter mais informações.

Exemplo

// Requires /std:c++20 or later
#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 uma multiset cuja chave corresponde a uma chave especificada por parâmetro.

size_type count(const Key& key) const;

Parâmetros

key
A chave dos elementos a serem combinados a partir do multiset.

Valor de retorno

O número de elementos na multiset chave de classificação cuja chave de classificação corresponde à chave de parâmetro.

Observações

A função de 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 multisetfunção de membro ::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 endereçando o primeiro elemento em um conjunto múltiplo invertido.

const_reverse_iterator crbegin() const;

Valor de retorno

Um iterador bidirecional reverso const abordando o primeiro elemento em um multiconjunto reverso ou abordando o que tinha sido o último elemento no multiconjunto não invertido.

Observações

crbegin é usado com um multiset invertido assim como begin é usado com um multiset.

Com o valor de retorno de crbegin, o objeto multiset não pode ser modificado.

crbegin pode ser usado para iterar através de um multiset para trás.

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 aborda o local que sucede o último elemento em um conjunto múltiplo invertido.

const_reverse_iterator crend() const;

Valor de retorno

Um iterador bidirecional reverso const que aborda o local que sucede o último elemento em um multiset reverso (o local que precedeu o primeiro elemento no multiset não invertido).

Observações

crend é usado com um multiset invertido, assim como end é usado com um multiset.

Com o valor de retorno de crend, o objeto multiset não pode ser modificado.

crend pode ser usado para testar se um iterador reverso chegou ao 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 assinado que pode ser usado para representar o número de elementos de a multiset em um intervalo entre elementos apontados por iteradores.

typedef typename allocator_type::difference_type difference_type;

Observações

O difference_type é o tipo retornado ao subtrair ou incrementar através de iteradores do contêiner. O difference_type é normalmente 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 não incluindo, o elemento apontado por last.

Embora difference_type esteja disponível para todos os iteradores que satisfazem os requisitos de um iterador de entrada, que inclui a classe de iteradores bidirecionais suportados por contêineres reversíveis como set, a subtração entre iteradores só é suportada por iteradores de acesso aleatório fornecidos por um contêiner de acesso aleatório como 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 construído no local (nenhuma operação de cópia ou movimentação é executada), 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 no multiset.

Valor de retorno

Um iterador para o elemento recém-inserido.

Observações

Nenhuma referência a elementos de contêiner é invalidada por essa função, mas ela pode invalidar todos os iteradores para o contêiner.

Durante a colocação, 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 construído no local (nenhuma operação de cópia ou movimentação é executada), 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 no multiset.

where
O lugar para começar a procurar o ponto correto de inserção. (Se esse ponto preceder whereimediatamente, a inserção pode ocorrer em tempo constante amortizado em vez de tempo logarítmico.)

Valor de retorno

Um iterador para o elemento recém-inserido.

Observações

Nenhuma referência a elementos de contêiner é invalidada por essa função, mas ela pode invalidar todos os iteradores para o contêiner.

Durante a colocação, 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 um multiset está vazio.

bool empty() const;

Valor de retorno

true se o multiset estiver vazio, false se o multiset estiver 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 passado-a-fim.

const_iterator end() const;

iterator end();

Valor de retorno

O iterador passado-a-fim. Se o multiset estiver vazio, então multiset::end() == multiset::begin().

Observações

end é usado para testar se um iterador passou o final 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 multiset primeiro elemento no com uma chave que é 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 de argumento a ser comparada com a chave de classificação de um elemento do que está sendo multiset pesquisado.

Valor de retorno

Um par de iteradores tal 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 de membro, use pr. firste para anular a referência do iterador de limite inferior, utilize *(pr. first). Para acessar o segundo iterador de um par pr retornado pela função de membro, use pr. seconde 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 de 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
Posição do elemento a remover.

First
Posição do primeiro elemento a ser removido.

Last
Posicione logo após o último elemento a ser removido.

key
O valor-chave dos elementos a serem removidos.

Valor de retorno

Para as duas primeiras funções de membro, um iterador bidirecional que designa o primeiro elemento restante além de quaisquer elementos removidos, ou um elemento que é o final do multiset se tal elemento não existir.

Para a função de terceiro membro, retorna o número de elementos que foram removidos do multiset.

Observações

Para obter um exemplo de código, consulte set::erase.

multiset::find

Retorna um iterador que se refere ao local de um elemento em um multiset que tem 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 que está sendo multiset pesquisado.

Valor de retorno

Um iterador que se refere ao local de um elemento com uma chave especificada ou o local que sucede o último elemento no multiset(multiset::end()) se nenhuma correspondência for encontrada para a chave.

Observações

A função member retorna um iterador que se refere a um elemento na multiset chave cuja é equivalente ao argumento key sob um predicado binário que induz uma ordenação baseada em uma relação de menor comparabilidade.

Se o valor de retorno de find for atribuído a um const_iterator, o objeto multiset não poderá ser modificado. Se o valor de retorno de find for atribuído a um iterator, o multiset objeto pode 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 utilizado pelo multiset.

Observações

Os alocadores para a classe multiset especificam como a classe gerencia o armazenamento. Os alocadores padrão fornecidos com classes de contêiner C++ Standard Library são suficientes para a maioria das necessidades de programação. Escrever e usar sua própria classe de alocador é um tópico C++ avançado.

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

// (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 no multiset.

Where
O lugar para começar a procurar o ponto correto de inserção. (Se esse ponto preceder Whereimediatamente, a inserção pode ocorrer em tempo constante amortizado em vez de tempo logarítmico.)

ValTy
Parâmetro de modelo que especifica o tipo de argumento que o multiset pode usar para construir um elemento de value_type, e perfect-forwards Val como um argumento.

First
A posição do primeiro elemento a ser copiado.

Last
A posição logo após o último elemento a ser copiado.

1
Argumento de função de modelo que atende aos requisitos de um input_iterator_tag que aponta para elementos de um tipo que podem ser usados para construir 1 objetos.

IList
O initializer_list do qual copiar os elementos.

Valor de retorno

As funções de membro de inserção de elemento único, (1) e (2), retornam um iterador para a posição onde o novo elemento foi inserido no multiset.

As funções de membro single-element-with-hint, (3) e (4), retornam um iterador que aponta para a posição onde o novo elemento foi inserido no multiset.

Observações

Nenhum ponteiro ou referência é invalidado por essa função, mas 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 set, multiset<V>::value_type é o tipo const V.

A função de membro do intervalo (5) insere a sequência de valores do elemento em um multiset que corresponde a cada elemento abordado por um iterador no intervalo [First, Last), portanto, Last não é inserida. A função end() de membro do contêiner 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 into s.

A função de membro da lista do inicializador (6) usa um initializer_list para copiar elementos para o multiset.

Para inserção de um elemento construído no local, ou seja, nenhuma operação de cópia ou movimentação é executada, consulte 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 um multisetarquivo .

typedef implementation-defined iterator;

Exemplo

Veja o exemplo para começar para obter um exemplo de como declarar e usar um iteratorarquivo .

multiset::key_comp

Recupera uma cópia do objeto de comparação usado para ordenar chaves em um multisetarquivo .

key_compare key_comp() const;

Valor de retorno

Retorna o objeto de função que a multiset usa para ordenar seus elementos, que é o parâmetro Comparetemplate .

Para obter mais informações sobre Compareo , consulte a seção Comentários do tópico Classe multiset .

Observações

O objeto armazenado define a função de membro:

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

que retorna true se x precede estritamente y na ordem de classificação.

Ambos key_compare e value_compare são sinônimos para o parâmetro Comparetemplate . Ambos os tipos são fornecidos para o conjunto de classes e multiset, onde são idênticos, para compatibilidade com o mapa de classes e multimapa, onde 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;

Observações

key_compare é sinônimo do parâmetro de modelo Compare.

Para obter mais informações sobre Compareo , consulte a seção Comentários do multiset tópico Classe .

Exemplo

Veja o exemplo para key_comp obter um exemplo de 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 no multiset.

typedef Key key_type;

Observações

key_type é sinônimo do parâmetro de modelo Key.

Para obter mais informações sobre Keyo , consulte a seção Comentários do multiset tópico Classe .

Exemplo

Veja o exemplo para value_type obter um exemplo de 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 do que uma chave especificada.

const_iterator lower_bound(const Key& key) const;

iterator lower_bound(const Key& key);

Parâmetros

key
A chave de argumento a ser comparada com a chave de classificação de um elemento do que está sendo multiset pesquisado.

Valor de retorno

Um iterator ou const_iterator que aborda o local de um elemento em um multiset que com uma chave que é igual ou maior do que a chave de argumento, ou que aborda o local que sucede o último elemento no 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

Devolve o comprimento máximo da multiset.

size_type max_size() const;

Valor de retorno

O comprimento máximo possível do 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 usada para esse objeto multiset, cujo padrão é Allocator.

Comp
A função de comparação do tipo const Compare usada para ordenar os elementos no multiset, que assume como Comparepadrão .

Right
o multiset do qual o multiconjunto construído deve ser uma cópia.

First
A posição do primeiro elemento na gama de elementos a serem copiados.

Last
A posição do primeiro elemento além da gama de elementos a serem copiados.

IList
O initializer_list do qual copiar os elementos.

Observações

Todos os construtores armazenam um tipo de objeto alocador que gerencia o armazenamento de memória para o multiset e que pode ser retornado posteriormente chamando get_allocator. O parâmetro allocator é frequentemente omitido nas declarações de classe e macros de pré-processamento usadas para substituir 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 do multiset e que pode ser retornado posteriormente chamando key_comp.

Os três primeiros construtores especificam um multiconjunto inicial vazio, o segundo especifica o tipo de função de comparação (Comp) a ser usado no estabelecimento da ordem dos elementos e o terceiro especifica explicitamente o tipo de alocador (Al) a ser usado. A palavra-chave explicit suprime certos tipos de conversão automática de tipos.

O quarto construtor especifica uma cópia do multisetRight.

O quinto construtor especifica uma cópia do multiset movendo Right.

Os construtores 6º, 7º e 8º especificam um initializer_list do qual copiar os elementos.

Os próximos três construtores copiam o intervalo [First, Last) de a multiset com crescente explicitação na especificação do tipo de função de comparação e 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 deste multiset usando elementos de outro multiset.

multiset& operator=(const multiset& right);

multiset& operator=(multiset&& right);

Parâmetros

Right
A partir da qual os multiset elementos são copiados ou movidos.

Observações

operator= copia ou move os elementos para Right este multiset, dependendo do tipo de referência (lvalue ou rvalue) usado. Os elementos que estão nisso multiset antes operator= de serem executados 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;

Observações

Um tipo 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 multiset objeto.

multiset::rbegin

Retorna um iterador endereçando o primeiro elemento em um conjunto múltiplo invertido.

const_reverse_iterator rbegin() const;

reverse_iterator rbegin();

Valor de retorno

Um iterador bidirecional reverso abordando o primeiro elemento em um invertido multiset ou abordando o que havia sido o último elemento no invertido multiset.

Observações

rbegin é usado com um inverso, multiset assim como rbegin é usado com um multisetarquivo .

Se o valor de retorno de rbegin for atribuído a um const_reverse_iterator, o multiset objeto não poderá ser modificado. Se o valor de retorno de rbegin for atribuído a um reverse_iterator, o multiset objeto poderá ser modificado.

rbegin pode ser usado para iterar através de um multiset para trás.

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 aborda o local que sucede o último elemento em uma multisetinvertida.

const_reverse_iterator rend() const;

reverse_iterator rend();

Valor de retorno

Um iterador bidirecional reverso que aborda o local que sucede o último elemento em um invertido multiset (o local que precedeu o primeiro elemento no invertido multiset).

Observações

rend é usado com um multiset invertido, assim como end é usado com um multiset.

Se o valor de retorno de rend for atribuído a um const_reverse_iterator, o multiset objeto não poderá ser modificado. Se o valor de retorno de rend for atribuído a um reverse_iterator, o multiset objeto poderá ser modificado.

rend pode ser usado para testar se um iterador reverso atingiu 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 conjunto múltiplo invertido.

typedef std::reverse_iterator<iterator> reverse_iterator;

Observações

Um tipo reverse_iterator é usado para iterar através do inverso multiset .

Exemplo

Veja um exemplo rbegin de como declarar e usar reverse_iteratoro .

multiset::size

Devolve o número de elementos na 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 inteiro não assinado que pode representar o número de elementos em um multisetarquivo .

typedef typename allocator_type::size_type size_type;

Exemplo

Veja um exemplo size de como declarar e usar size_type

multiset::swap

Troca os elementos de dois conjuntos múltiplos.

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

Parâmetros

Right
O argumento multiset fornecendo os elementos a serem trocados com o multiset de destino.

Observações

A função de membro não invalida referências, ponteiros ou iteradores que designam elementos nos dois multiconjuntos cujos elementos estão sendo 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 do que uma chave especificada.

const_iterator upper_bound(const Key& key) const;

iterator upper_bound(const Key& key);

Parâmetros

key
A chave de argumento a ser comparada com a chave de classificação de um elemento do que está sendo multiset pesquisado.

Valor de retorno

Um iterador ou const_iterator que aborda o local de um elemento em um multiset com uma chave que é maior do que a chave de argumento, ou que aborda o local que sucede o último elemento no 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 elementos em um multisetarquivo .

value_compare value_comp() const;

Valor de retorno

Retorna o objeto de função que a multiset usa para ordenar seus elementos, que é o parâmetro Comparetemplate .

Para obter mais informações sobre Compareo , consulte a seção Comentários do multiset tópico Classe .

Observações

O objeto armazenado define a função de membro:

operador bool( const Key&_xVal, const Key&_yVal);

que retorna true se _xVal precede e não é igual a _yVal na ordem de classificação.

Ambos key_compare e value_compare são sinônimos para o parâmetro Comparetemplate . Ambos os tipos são fornecidos para o conjunto de classes e multiset, onde são idênticos, para compatibilidade com o mapa de classes e multimap, onde 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 no multiset.

typedef key_compare value_compare;

Observações

value_compare é sinônimo do parâmetro de modelo Compare.

Ambos key_compare e value_compare são sinônimos para o parâmetro Comparetemplate . Ambos os tipos são fornecidos para o conjunto de classes e multiset, onde são idênticos, para compatibilidade com o mapa de classes e multimap, onde são distintos.

Para obter mais informações sobre Compareo , consulte a seção Comentários do tópico Classe multiset .

Exemplo

Veja o exemplo para value_comp obter um exemplo de como declarar e usar value_compare.

multiset::value_type

Um tipo que descreve um objeto armazenado como um elemento como um multiset em sua capacidade como um valor.

typedef Key value_type;

Observações

value_type é sinônimo do parâmetro de modelo Key.

Ambos key_type e value_type são sinônimos para o parâmetro Keytemplate . Ambos os tipos são fornecidos para o conjunto de classes e multiset, onde são idênticos, para compatibilidade com o mapa de classes e multimapa, onde são distintos.

Para obter mais informações sobre Keyo , 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.

Ver também

Contentores
segurança de threads na biblioteca padrão C++
Referência da Biblioteca Padrão C++