C++:
Usando arrays associativos

Como fazer:

Em C++, os arrays associativos ganham vida com os cabeçalhos <map> e <unordered_map>. Vamos detalhar exemplos para ver ambos em ação.

Usando std::map

std::map mantém os elementos ordenados com base na chave. Aqui está como você começa:

#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> ageMap;
    
    // Inserindo valores
    ageMap["Alice"] = 30;
    ageMap["Bob"] = 25;
    
    // Acessando valores
    std::cout << "Idade do Bob: " << ageMap["Bob"] << std::endl;
    
    // Iterando sobre um map
    for(const auto &pair : ageMap) {
        std::cout << pair.first << " tem " << pair.second << " anos." << std::endl;
    }
    
    return 0;
}

Usando std::unordered_map

Quando a ordem não importa, mas o desempenho sim, std::unordered_map é seu amigo, oferecendo uma complexidade média mais rápida para inserções, buscas e deleções.

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::unordered_map<std::string, double> productPrice;
    
    // Inserindo valores
    productPrice["leite"] = 2.99;
    productPrice["pão"] = 1.99;
    
    // Acessando valores
    std::cout << "Preço do leite: $" << productPrice["leite"] << std::endl;
    
    // Iterando sobre um unordered_map
    for(const auto &pair : productPrice) {
        std::cout << pair.first << " custa $" << pair.second << std::endl;
    }
    
    return 0;
}

Aprofundando

Arrays associativos em C++, particularmente std::map e std::unordered_map, não são apenas sobre armazenar elementos. Eles fornecem uma base para uma gestão de dados mais complexa ao permitir operações como busca, inserção e remoção em complexidades de tempo eficientes (logarítmica para std::map e tempo médio constante para std::unordered_map). Essa eficiência vem das estruturas de dados subjacentes: uma árvore balanceada para std::map e uma tabela de hash para std::unordered_map.

Historicamente, antes de serem parte da biblioteca padrão, os programadores teriam que implementar suas próprias versões ou usar bibliotecas de terceiros, levando a inconsistências e potenciais ineficiências. A inclusão dos maps na biblioteca padrão de C++ não apenas padronizou seu uso, mas também os otimizou para desempenho em diferentes compiladores e plataformas.

Embora ambos sejam poderosos, a escolha entre um std::map e um std::unordered_map depende dos detalhes do seu caso de uso. Precisa de dados ordenados e não se importa com uma pequena troca de desempenho? Opte por std::map. Se você está atrás de velocidade e não se importa com a ordem, std::unordered_map é provavelmente sua melhor aposta.

No entanto, é importante notar que ao trabalhar com estruturas de dados complexas, sempre existem trocas. Em alguns casos de nicho, outras estruturas de dados ou até mesmo bibliotecas de terceiros podem oferecer melhor desempenho ou funcionalidade adequada às suas necessidades específicas. Sempre avalie suas opções com base nos requisitos do seu projeto.