Maison >développement back-end >C++ >Comment puis-je conserver l'ordre d'insertion dans une carte tout en conservant des recherches efficaces ?

Comment puis-je conserver l'ordre d'insertion dans une carte tout en conservant des recherches efficaces ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-03 16:17:11432parcourir

How Can I Preserve Insertion Order in a Map While Maintaining Efficient Lookups?

Préserver l'ordre d'insertion dans un std::map

Dans les situations où l'ordre d'insertion est crucial, s'appuyer uniquement sur un std::map peut ne pas suffire. Si le maintien de l'ordre d'insertion est une priorité, il existe des approches alternatives à considérer.

Une option consiste à convertir le contenu de la carte en std::vector avant d'itérer et d'imprimer ses valeurs. En tirant parti d'un foncteur approprié, vous pouvez utiliser std::sort pour organiser les éléments en fonction de leur ordre d'insertion.

Cependant, si des recherches rapides sont essentielles (par exemple, 10 millions de fois), l'utilisation d'un vecteur peut introduire des performances. préoccupations. Pour de tels scénarios, la bibliothèque boost::multi_index propose une solution qui combine l'efficacité d'une carte avec la flexibilité de plusieurs index.

Utilisation de boost::multi_index:

Cette bibliothèque vous permet d'établir plusieurs index pour chaque conteneur. Dans ce cas spécifique, vous pouvez définir une structure value_t avec des membres string et int, et utiliser deux index :

  1. Accès aléatoire : Représente l'ordre d'insertion
  2. Hashed Unique : Indexe le membre de la chaîne pour faciliter lookups

Vous pouvez ensuite instancier un multi_index_container comme ceci :

struct value_t {
    string s;
    int i;
};

struct string_tag {};

typedef multi_index_container<
    value_t,
    indexed_by<
        random_access<>, // insertion order
        hashed_unique<tag<string_tag>, member<value_t, string, &value_t::s>>
    >
> values_t;

Cette approche permet des recherches efficaces tout en préservant l'ordre d'insertion lors de l'itération du conteneur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn