web-dev-qa-db-fra.com

Que sont les conteneurs / adaptateurs? C ++

Que sont conteneurs/adaptateurs?

Quelqu'un s'il vous plaît expliquer dans la langue du profane .

J'ai essayé de chercher sur Internet mais les définitions et explications sont trop techniques et difficiles à comprendre.

J'ai une connaissance de base du C++ et de ses sous-sujets comme (classe/modèles/STL).

MODIFIER 1:

Quelqu'un peut-il me donner un exemple pratique d'application de conteneurs/adaptateurs?

Juste pour une meilleure compréhension :-)

Je vous remercie.

38
Pavitar

<joke>C++ est technique et difficile à comprendre: -D</joke>

Les conteneurs sont des types de données de STL qui peuvent contenir des données.

Exemple: vector en tant que tableau dynamique

Les adaptateurs sont des types de données de STL qui adaptent un conteneur pour fournir une interface spécifique.

Exemple: stack fournissant une interface de pile au-dessus du conteneur choisi

(note latérale: les deux sont en fait des modèles et non des types de données, mais la définition semble meilleure de cette façon)

62
Let_Me_Be

Un conteneur est une structure de données spécifique qui contient des données, généralement en quantité illimitée. Chaque type de conteneur a des limites sur la façon d'accéder, d'ajouter ou de supprimer efficacement des données.

Voici quelques exemples de conteneurs utilisant des classes STL.

Conteneurs de séquence

Voici les conteneurs de séquences, ce qui signifie que les données sont classées de manière fiable (c'est-à-dire qu'il y a un recto et un verso. Je ne veux pas dire qu'elles se trient automatiquement!).

  • UNE vecteur est un peu comme un tableau de taille flexible. Les vecteurs sont à accès aléatoire, ce qui signifie que vous pouvez accéder à n'importe quel élément avec un indice entier en temps constant (tout comme un tableau). Vous pouvez également ajouter ou supprimer à l'arrière du vecteur en temps constant amorti. N'importe où ailleurs, cependant, et vous envisagez probablement de recopier potentiellement tous les éléments.
  • UNE deque, ou file d'attente à double extrémité, est comme un vecteur, mais vous pouvez ajouter à l'avant ou à l'arrière en temps constant amorti. Vous pouvez toujours accéder aux éléments en temps constant, mais les éléments deque ne sont pas garantis contigus en mémoire comme les vecteurs ou les tableaux.
  • UNE liste est une liste chaînée, c'est-à-dire des données reliées entre elles par des pointeurs. Vous avez un accès constant au début et à la fin, mais pour arriver n'importe où au milieu, vous devez parcourir la liste. Vous pouvez ajouter des éléments n'importe où dans la liste en temps constant, cependant, si vous avez déjà un pointeur sur l'un des nœuds voisins.

Conteneurs associatifs

Ce sont des conteneurs associatifs, ce qui signifie que les éléments ne sont plus ordonnés mais ont plutôt des associations entre eux utilisés pour déterminer l'unicité ou les mappages:

  • UNE ensemble est un conteneur avec des éléments uniques. Vous ne pouvez ajouter qu'un seul de chaque élément à un ensemble; tous les autres ajouts sont ignorés.
  • UNE multiset est comme un ensemble, mais vous pouvez en mettre plusieurs dans un élément. Le multiset garde une trace du nombre d'éléments de chaque type dans la structure.
  • UNE carte, également appelé tableau associatif, est une structure dans laquelle vous insérez des paires clé-valeur; alors vous pouvez rechercher n'importe quelle valeur en fournissant la clé. C'est donc un peu comme un tableau auquel vous pouvez accéder avec un index de chaîne (clé) ou tout autre type d'index. (Si vous insérez une autre paire clé-valeur et que la clé existe déjà, vous remplacez simplement la valeur de la clé d'origine.)
  • UNE multimap est une carte qui permet l'insertion de plusieurs valeurs pour la même clé. Lorsque vous effectuez une recherche de clé, vous récupérez un conteneur avec toutes les valeurs qu'il contient.

Adaptateurs pour conteneurs

Les adaptateurs de conteneur, d'autre part, sont des interfaces créées en limitant la fonctionnalité dans un conteneur préexistant et en fournissant un ensemble différent de fonctionnalités. Lorsque vous déclarez les adaptateurs de conteneur, vous avez la possibilité de spécifier quels conteneurs de séquence forment le conteneur sous-jacent. Ceux-ci sont:

  • UNE empiler est un conteneur offrant un accès Last-In, First-Out (LIFO). Fondamentalement, vous supprimez les éléments dans l'ordre inverse de leur insertion. Il est difficile d'accéder à des éléments intermédiaires. Habituellement, cela va au-dessus d'un deque.
  • UNE queue est un conteneur fournissant un accès premier entré, premier sorti (FIFO). Vous supprimez les éléments dans le même ordre que vous les insérez. Il est difficile d'accéder à des éléments intermédiaires. Habituellement, cela va au-dessus d'un deque.
  • UNE file d'attente de priorité est un conteneur fournissant un accès trié aux éléments. Vous pouvez insérer des éléments dans n'importe quel ordre, puis récupérer à tout moment la "plus basse" de ces valeurs. Les files d'attente prioritaires dans C++ STL utilisent une structure de tas en interne, qui à son tour est essentiellement basée sur un tableau; ainsi, généralement cela va au-dessus d'un vecteur.

Voir cette page de référence pour plus d'informations, y compris la complexité temporelle pour chacune des opérations et des liens vers des pages détaillées pour chacun des types de conteneurs.

74
Platinum Azure

La définition technique du "conteneur" de La documentation SGI STL est assez bonne:

Un conteneur est un objet qui stocke d'autres objets (ses éléments) et qui a des méthodes pour accéder à ses éléments. En particulier, chaque type qui est un modèle de conteneur a un type d'itérateur associé qui peut être utilisé pour parcourir les éléments du conteneur.

Ainsi, un conteneur est une structure de données qui contient ("contient") une collection d'objets d'un certain type. L'idée clé est qu'il existe différents types de conteneurs, chacun d'entre eux stockant des objets d'une manière différente et offrant des caractéristiques de performances différentes, mais tous ont une interface standard de sorte que vous pouvez échanger les uns contre les autres facilement et sans trop modifier du code qui utilise le conteneur. L'idée est que les conteneurs sont conçus pour être interchangeables autant que possible.

Les adaptateurs de conteneur sont des classes qui fournissent un sous-ensemble des fonctionnalités d'un conteneur, mais peuvent fournir des fonctionnalités supplémentaires qui facilitent l'utilisation des conteneurs pour certains scénarios. Par exemple, vous pouvez facilement utiliser std::vector ou std::deque pour une structure de données de pile et appelez Push_back, back et pop_back comme interface de pile; std::stack fournit une interface qui peut utiliser un std::vector ou std::deque ou un autre conteneur de séquence mais fournit les fonctions membres Push, top et pop plus standard pour accéder aux membres.

7
James McNellis