
Nesse artigo do cpp::daily de hoje vamos ver como utilizar o contêiner std::unordered_map e a classe de template std::numeric_limits.
std::unordered_mapSeguindo o conceito similar de std::map que vimos anteriormente. std::unordered_map é um contêiner associado que armazena elementos formados pela combinação de um valor-chave e um valor mapeado.
Algumas diferenças entre std::map e std::unordered_map
std::map entrega os dados de forma crescente, já std::unordered_map não há ordem;std::map é mais utilizado para dados distantes na memória, já std::unordered_map para dados mais próximos;std::map mais utilizado para tipos numéricos, já std::unordered_map para strings, por exemplo;std::unordered_map é mais lento que std::map, mas não em todos.
A seguir vamos ver um exemplo básico de uso de std::unordered_map
#include <iostream>
#include <unordered_map>
int main(){
std::unordered_map<int, int> umap;
umap[11] = 2;
umap[17] = 12;
umap[8] = 4;
for( auto i : umap ){
std::cout << "Índice: " << i.first << " | Valor: " << i.second << '\n';
}
return 0;
}A saída será:
Índice: 8 | Valor: 4
Índice: 17 | Valor: 12
Índice: 11 | Valor: 2Perceba que os índices NÃO FORAM exibidos de forma crescente(a menos que adicionássemos na ordem, mas ainda assim seria decrescente), se alterarmos para std::map os índices aparecerão de forma crescente(independentemente da ordem que fossem adicionados): 8 11 17 . Uma das causas disso também está ferente ao cálculo feito para resgatar os dados da memória, o std::unordered_map usa Hash Table enquanto o std::map utiliza BST , para mais detalhes dessas implementações veja as referências ao final desse artigo.
std::numeric_limitsO std::numeric_limits Fornece informações sobre as propriedades dos tipos aritméticos (integrais ou de ponto flutuante) na plataforma específica para a qual a biblioteca é compilada com uma forma padronizada de consultar várias propriedades de tipos aritméticos (por exemplo, o maior valor possível para o tipo int é std::numeric_limits<int>::max() ) e entre outras funções.
O fato da compilação poder diferir de acordo com a plataforma e arquitetura, talvez o int, double, float, long int, … que você esperava para o usuário não será atendido e poderá gerar problemas no seu sofware, logo, você pode criar condições para diversas plataformas e arquiteturas possíveis.
Vamos ver esse código de exemplo que mostra a saída, ao final veremos o resultado que foi compilado em um Gentoo GNU/Linux 64-bit.
#include <iostream>
#include <limits>
int main(){
std::cout << "Meu sistema suporta o máximo de 'int' de " << std::numeric_limits<int>::digits << " de dígitos." << '\n';
std::cout << "O número máximo de 'int' é " << std::numeric_limits<int>::max() << '\n';
std::cout << "-----------------------------------------" << '\n';
std::cout << "Meu sistema suporta o máximo de 'float' de " << std::numeric_limits<float>::digits << " de dígitos." << '\n';
std::cout << "O número máximo de 'float' é " << std::numeric_limits<float>::max() << '\n';
std::cout << "-----------------------------------------" << '\n';
std::cout << "Meu sistema suporta o máximo de 'double' de " << std::numeric_limits<double>::digits << " de dígitos." << '\n';
std::cout << "O número máximo de 'double' é " << std::numeric_limits<double>::max() << '\n';
std::cout << "-----------------------------------------" << '\n';
std::cout << "Meu sistema suporta o máximo de 'long int' de " << std::numeric_limits<long int>::digits << " de dígitos." << '\n';
std::cout << "O número máximo de 'long int' é " << std::numeric_limits<long int>::max() << '\n';
std::cout << "-----------------------------------------" << '\n';
return 0;
}No meu caso a saída foi:
Meu sistema suporta o máximo de 'int' de 31 de dígitos.
O número máximo de 'int' é 2147483647
-----------------------------------------
Meu sistema suporta o máximo de 'float' de 24 de dígitos.
O número máximo de 'float' é 3.40282e+38
-----------------------------------------
Meu sistema suporta o máximo de 'double' de 53 de dígitos.
O número máximo de 'double' é 1.79769e+308
-----------------------------------------
Meu sistema suporta o máximo de 'long int' de 63 de dígitos.
O número máximo de 'long int' é 9223372036854775807
-----------------------------------------Pode e deve ser útil para muitos casos!
Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !
Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:
Acesse o endereço: