<unordered_set> do contêiner STL

ambiente de teste

Sistema: ubuntu 22.04.2 LTS 64-bit
versão gcc: 11.3.0
Editor: vsCode 1.76.2

Introdução ao unordered_set

  1. Contêiner associativo.
  2. Os elementos são únicos e são valores e chaves.
  3. Os elementos não podem ser modificados diretamente, eles precisam ser excluídos e depois inseridos.
  4. Iteradores unidirecionais são suportados.
  5. Um iterador não é invalidado quando um elemento é inserido e um iterador apontando para o elemento excluído é invalidado quando um elemento é excluído.
  6. A complexidade de tempo de inserção, exclusão e localização de elementos é O(1), pior caso O(n). .

arquivo principal

#include <map>

definição de classe de módulo

  template<typename _Value, 
  	   typename _Hash = hash<_Value>,
  	   typename _Pred = equal_to<_Value>,
	   typename _Alloc = allocator<_Value>>
    class unordered_set{
    
    };

_Value: Indica o tipo de dado armazenado
_Hash: Tipo de objeto de função hash
_Pred: Indica o método de classificação de acordo com a chave.
_Alloc: Indica o tipo do alocador armazenado, que é responsável pela alocação e liberação da memória do elemento. Parâmetro opcional, geralmente não usado.

construção de objetos

 std::unordered_set<int> unorderset2(10);
/*拷贝构造函数*/
std::unordered_set<int> unorderset3(unorderset1);
/*移动构造函数*/
std::unordered_set<int> unorderset4(std::move(unorderset1));
/*初始化列表构造函数*/
std::unordered_set<int> unorderset5({
    
    6,1,2,5,4,3,8});
/*初始化列表+最小桶数量 构造函数*/
std::unordered_set<int> unorderset6({
    
    6,1,2,5,4,3,8},10);
/*指定迭代器范围构造函数*/
std::unordered_set<int> unorderset7(++unorderset5.begin(), unorderset5.end());
/*指定迭代器范围+指定最小桶数量构造函数*/
std::unordered_set<int> unorderset8(++unorderset5.begin(), unorderset5.end(),10);

inicialização

/*初始化列表初始化元素*/
set1 = {
    
    1,3,5,4,2};

acesso ao elemento

A função at() e o operador subscrito não são suportados para acessar elementos

Inserção e exclusão de elementos

função valor de retorno Função
claro() nenhum limpar todos os elementos
apagar() iterador ou número de elementos removidos Limpa um elemento em uma posição especificada, um elemento em um intervalo especificado por um iterador ou um valor por uma chave
lugar() par chave-valor Inserir elemento. Quando a inserção é bem-sucedida, o primeiro elemento é um iterador apontando para o elemento recém-inserido. Quando falha, o primeiro elemento é um iterador apontando para o elemento existente e o segundo elemento representa o resultado da inserção. True é bem-sucedido e false falha .
emplace_hint() iterador O iterador do elemento recém-inserido é retornado se a inserção for bem-sucedida e o iterador do elemento existente é retornado quando a inserção falha
inserir() par chave-valor, iterador, Nenhum 1) Insira um elemento na posição especificada. 2) Copia os elementos no intervalo especificado pelo iterador. 3) Insira elementos através da lista de inicializadores. 4) Insira elementos diretamente.
/*直接构造并插入元素*/
std::pair<std::unordered_set<int>::iterator,bool> pair1 = unordersetTest.emplace(6);
std::cout << "emplace result is "<<std::boolalpha<<pair1.second<<std::endl;
std::cout << "pair1 iterator value is "<<*pair1.first<<std::endl;

/*使用移动语句插入元素*/
int iValue = 8;
std::pair<std::unordered_set<int>::iterator,bool> pair3 = unordersetTest.emplace(std::move(iValue));
std::cout << "emplace result is "<<std::boolalpha<<pair3.second<<std::endl;
std::cout << "pair3 iterator value is "<<*pair3.first<<std::endl;

/*直接构造并在指定位置插入元素*/
std::unordered_set<int>::iterator itr1 = unordersetTest.emplace_hint(++unordersetTest.begin(),1);
std::cout << "itr1 value is "<<*itr1;

/*删除单个元素*/
std::unordered_set<int>::iterator itr2 = unordersetTest.erase(unordersetTest.begin());
std::cout << "itr2 alue is "<<*itr2<<std::endl;

/*删除指定范围的元素*/
std::unordered_set<int>::iterator itr3 = unordersetTest.erase(unordersetTest.begin(), ++unordersetTest.begin());
std::cout << "itr3 value is "<<*itr3<<std::endl;

/*根据键值删除元素*/
int iCount = unorderset1.erase(1);
std::cout << "erace element count is "<<iCount<<std::endl;

/*清空元素*/
unordersetTest.clear();

/*插入元素,返回键值对*/
std::pair<std::unordered_set<int>::iterator,bool> pair4 = unordersetTest.insert(3);
std::cout << "insert result is "<<std::boolalpha<<pair4.second<<std::endl;
std::cout << "pair4 iterator value is "<<*pair4.first<<std::endl;

/*使用移动语句插入元素,返回键值对*/
int iValue2 = 7;
std::pair<std::unordered_set<int>::iterator,int> pair6 = unordersetTest.insert(std::move(iValue2));
std::cout << "insert result is "<<std::boolalpha<<pair6.second<<std::endl;
std::cout << "pair6 iterator value is "<<*pair6.first<<std::endl;

/*插入元素,返回迭代器*/
std::unordered_set<int>::iterator itr4 = unordersetTest.insert(unordersetTest.begin(),9);
std::cout << "insert value is "<< *itr4<<std::endl;

/*使用移动语句插入元素,返回迭代器*/
int iValue1 = 2;
std::unordered_set<int>::iterator itr5 = unordersetTest.insert(unordersetTest.begin(),std::move(iValue1));
std::cout << "insert value is "<< *itr5<<std::endl;

/*初始化列表插入,无返回值*/
unordersetTest.insert({
    
    5,7,6});

/*使用迭代器指定范围插入元素,无返回值*/
std::unordered_set<int> unorderset9({
    
    11,12});
unordersetTest.insert(unorderset9.begin(),unorderset9.end());

pesquisa de elemento

função valor de retorno Função
contar() padrão::tamanho_t Retorna o número de elementos correspondentes a uma determinada chave
encontrar() iterador Encontre a posição do elemento correspondente à chave especificada, se não for encontrado, retorne end()
intervalo_igual() par chave-valor Obtenha o intervalo que corresponde ao elemento fornecido. Se não existir, o par chave-valor é end()
/*判断某个键对应值的数量*/
std::cout<<unordersetTest.count(3)<<std::endl;
/*查找指定键的元素所在的位置*/
std::unordered_set<int>::iterator itr6 = unordersetTest.find(4);
std::cout<<"find value is "<<*itr6<<std::endl;
/*返回给定键的范围*/
std::pair<std::unordered_set<int>::iterator,std::unordered_set<int>::iterator> ret7 = unorderset1.equal_range(1);
if (unorderset1.end() != ret7.first)
{
    
    
    std::cout<<"first value is "<<*ret7.first<<std::endl;
}
if (unorderset1.end() != ret7.second)
{
    
    
    std::cout<<"second value is "<<*ret7.second<<std::endl;
}

tamanho do recipiente

função valor de retorno Função
tamanho() padrão::tamanho_t Obtenha o número de elementos no contêiner atual
vazio() bool Determine se o contêiner atual está vazio, retorne true se estiver vazio, caso contrário, retorne false
tamanho máximo() padrão::tamanho_t Retorna a capacidade máxima do contêiner
unordersetTest = {
    
    1,2,5,4,3};
/*判断元素的数量*/
std::cout<<unordersetTest.size()<<std::endl;
/*判断容器最大能容纳的元素的数量*/
std::cout<<unordersetTest.max_size()<<std::endl;
/*判断容器是否为空*/
std::cout<<std::boolalpha<<unordersetTest.empty()<<std::endl;

iterador

tipo Função
iterador Iterador de acesso de encaminhamento. Elementos de acesso da frente para trás, podem ser lidos ou modificados
const_iterator Iterador de acesso de encaminhamento constante. Acesse os elementos da frente para trás, apenas leia e não modifique
função valor de retorno Função
começar() iterador de acesso direto Retorna um iterador apontando para a localização do primeiro elemento do objeto unordered_set
fim() iterador de acesso direto Retorna um iterador apontando para a próxima posição do elemento no final do objeto unordered_set
cbegin() iterador de acesso direto const Retorna um iterador constante apontando para a posição do primeiro elemento do objeto unordered_set
um pouco() iterador de acesso direto const Retorna um iterador apontando para a próxima posição do elemento no final do objeto unordered_set
std::unordered_set<int> unordersetTest({
    
    6,7,8,9,10,1,2,3,4,5});
/*常量正向随机访问迭代器*/
std::cout << "unordersetTest:";
std::unordered_set<int>::const_iterator cItr;
for (cItr = unordersetTest.cbegin(); cItr != unordersetTest.cend(); cItr++)
{
    
    
    /* 不允许修改值,编译报错 */
    //*itr += 10; 
    /* 访问元素 */
    std::cout <<*cItr<< " ";
}
std::cout<<std::endl;
/*正向随机访问迭代器,每个元素+10*/
std::cout << "unordersetTest:";
std::unordered_set<int>::iterator itr;
for (itr = unordersetTest.begin(); itr != unordersetTest.end(); itr++)
{
    
    
    /* 不允许修改值,编译报错 */
    /*itr += 10; 
    /* 访问元素 */
    std::cout <<*itr << " ";
}
std::cout<<std::endl;

troca de elemento

Nome da função valor de retorno Função
trocar() nenhum Troca os elementos de dois containers
/*交互两个容器元素的值,无返回值*/
std::unordered_set<int> unordersetSwap1 = {
    
    1,2,3,4,5};
std::unordered_set<int> unordersetSwap2 = {
    
    6,7,8,9,10};
/*方式1, unordersetSwap1={6,7,8,9,10}, unordersetSwap2={1,2,3,4,5}*/
unordersetSwap1.swap(unordersetSwap2);
std::cout << "unordersetSwap1: "<<std::endl;
for (auto &item : unordersetSwap1)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;
std::cout << "unordersetSwap2: "<<std::endl;
for (auto &item : unordersetSwap2)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;
/*unordersetSwap1={1,2,3,4,5}, unordersetSwap2={6,7,8,9,10}*/
std::swap(unordersetSwap1,unordersetSwap2);
std::cout << "unordersetSwap1: "<<std::endl;
for (auto &item : unordersetSwap1)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;
std::cout << "unordersetSwap2: "<<std::endl;
for (auto &item : unordersetSwap2)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;

Outras funções

Nome da função valor de retorno Função
balde() std::size_type Obtenha o número do balde correspondente à chave fornecida
balde_conta() std::size_type Obtenha o número total de baldes na tabela de hash
balde_tamanho() std::size_type Obtenha o tamanho do balde com base no número do balde
load_factor() flutuador Obter o número médio de elementos por balde
max_bucket_count() std::size_type Obtenha o número máximo atual de baldes permitidos
max_load_factor() flutuante ou nenhum Obter ou definir o número máximo de elementos por bucket
repetir() nenhum Regenere a tabela de hash de acordo com o número especificado de baldes

Observação: o balde refere-se ao balde de hash. Para obter detalhes, você mesmo pode descobrir o conhecimento relevante do algoritmo de hash.

Acho que você gosta

Origin blog.csdn.net/qq_35699583/article/details/129967084
Recomendado
Clasificación