// std::unordered_map por dentro, hasta donde la interfaz deja mirar.
#include <cstddef>
#include <functional>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

void print_order(const std::unordered_map<std::string, int>& table) {
    for (const auto& entry : table) {
        std::cout << " " << entry.first;
    }
    std::cout << "\n";
}

int main() {
    std::unordered_map<std::string, int> sizes;
    std::cout << "al inicio: bucket_count " << sizes.bucket_count() << ", max_load_factor "
              << sizes.max_load_factor() << "\n";
    std::cout << "crece en n =";
    std::size_t buckets = sizes.bucket_count();
    std::vector<std::size_t> history = {buckets};
    for (int i = 0; i < 2000; i++) {
        sizes["k" + std::to_string(i)] = i;
        if (sizes.bucket_count() != buckets) {
            buckets = sizes.bucket_count();
            std::cout << " " << sizes.size();
            history.push_back(buckets);
        }
    }
    std::cout << "\nbucket_count:";
    for (std::size_t value : history) {
        std::cout << " " << value;
    }
    std::cout << "\ncon n = " << sizes.size() << ": load_factor " << sizes.load_factor() << "\n";

    std::unordered_map<std::string, int> cities;
    for (const std::string city : {"lima", "cusco", "puno", "tacna", "ica", "piura"}) {
        cities[city] = static_cast<int>(city.size());
    }
    std::cout << "orden:";
    print_order(cities);
    cities.rehash(100);
    std::cout << "tras rehash(100), bucket_count " << cities.bucket_count() << ":";
    print_order(cities);

    std::cout << "contains(\"ica\") " << cities.contains("ica") << ", contains(\"nazca\") "
              << cities.contains("nazca") << ", size " << cities.size() << "\n";
    std::cout << "cities[\"nazca\"] " << cities["nazca"] << ", size " << cities.size() << "\n";
    std::cout << "hash(\"lima\") = " << std::hash<std::string>{}("lima") << "\n";
}
