Les map en C++ sont des conteneurs associatifs de la STL. Ils permettent d’associer une clé et une valeur.

Il existe une unordered_map lorsque l’ordre de stockage des données n’est pas important. On utilise une map lorsque l’on souhaite que les données restent dans l’ordre.

Cela a un impact notamment lorsqu’on itère sur la map. L’unordered_map ne garantissant pas l’ordre des éléments.

Exemple

Association de chaînes

std::unordered_map<std::string, std::string> numbers;
numbers["zéro"] = "zero";
numbers["un"] = "one";
numbers["deux"] = "two";
numbers["trois"] = "three";

std::cout << numbers["zéro"] << std::endl;
std::cout << numbers["trois"] << std::endl;

Sortie :

zero
three

Association chaînes et fonctions

#include <functional> // for std::function
#include <iostream>   // for std::cout and cerr
#include <string>
#include <unordered_map>
#include <vector>

int  list_files(const std::vector<std::string> &args);
void cat_one_file(const std::string &file_name);
int  cat_files(const std::vector<std::string> &args);

static int true_builtin(const std::vector<std::string> &args)
{
    return 0;
}

static int false_builtin(const std::vector<std::string> &args)
{
    return 1;
}

std::unordered_map<std::string,
                   std::function<int(const std::vector<std::string> &)>>
    built_ins{{std::string("ls"), list_files},
              {std::string("cat"), cat_files},
              {std::string("true"), true_builtin},
              {std::string("false"), false_builtin}};

int main(int ac, char **av)
{
    std::vector<std::string> args;
    int                      idx{2};

    if (ac < 2)
        return (1);
    while (idx < ac) {
        args.push_back(av[idx]);
        idx += 1;
    }
    return built_ins[av[1]](args);
}

exemple complet

Utilisation, avec sorties tronquées.

$ ./a.out ls
main.cpp
[...]
$ ./a.out cat main.cpp
#include <exception>  // for system_error
#include <iostream>   // for std::cout and cerr
[...]