Que sont les conteneurs / Adaptateurs? C++

Quels sont les conteneurs/adaptateurs ?

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

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

J'ai des connaissances de base de C++ et de ses sous-sujets comme (class / templates/STL).

MODIFIER 1:

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

Juste pour le mieux comprendre: -)

Je vous Remercie.

30
demandé sur Pavitar 2010-10-06 18:52:36

3 réponses

<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 comme un tableau dynamique

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

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

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

52
répondu Let_Me_Be 2010-10-06 15:06:09

Un conteneur est une structure de données 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 des données efficacement.

Voici quelques exemples de conteneurs utilisant des classes STL.

Conteneurs De Séquence

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

  • Un vecteur est un peu comme une souplesse tableau de taille. Les vecteurs sont à accès aléatoire, ce qui signifie que vous pouvez accéder à n'importe quel élément avec un index entier en temps constant (tout comme un tableau). Vous pouvez également ajouter ou supprimer de la fin du tableau en temps (presque) constant. Ailleurs, cependant, et vous êtes probablement à la recherche à avoir à recopier potentiellement tous les éléments.
  • Un deque, ou double-clos de la file d'attente, c'est comme un vecteur, mais vous pouvez ajouter à l'avant ou à l'arrière. Vous pouvez toujours accéder à éléments en temps constant, mais les éléments deque ne sont pas garantis pour être contigus dans la mémoire comme des vecteurs ou des tableaux.
  • une liste est une liste liée, ce qui signifie des données qui sont liées entre elles par des pointeurs. Vous avez un accès à temps constant au début et à la fin, mais pour obtenir n'importe où au milieu, vous devez parcourir la liste. Vous pouvez cependant ajouter des éléments n'importe où dans la liste en temps constant, si vous avez déjà un pointeur sur l'un des éléments à proximité nœud.

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ées pour déterminer l'unicité ou les mappages:

  • Un set 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.
  • Un multiset, c'est comme un jeu, mais vous pouvez mettre plus d'un d'un élément. Le multiset garde une trace de combien de chaque type d'élément dans la structure.
  • un map , également connu sous le nom de tableau associatif, est une structure dans laquelle vous insérez des paires clé-valeur; vous pouvez alors 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 écrasez simplement la valeur de la clé d'origine.)
  • Un 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.

Adaptateurs De Conteneurs

Les adaptateurs de conteneur, d'autre part, sont des interfaces créées en limitant les fonctionnalités dans un conteneur préexistant et en fournissant un ensemble de fonctionnalités différent. 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. Ils sont:

  • une pile {[11] } est un conteneur fournissant un accès de dernier entré, premier sorti (LIFO). Fondamentalement, vous supprimez des éléments dans l'ordre inverse vous les insérez. Il est difficile d'accéder à des éléments au milieu. Habituellement, cela va au-dessus d'un deque.
  • une file d'attente {[11] } 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 au milieu. Habituellement, cela va sur le dessus de un deque.
  • a priority_queue est un conteneur fournissant un accès par ordre trié aux éléments. Vous pouvez insérer des éléments dans n'importe quel ordre, puis récupérer le "plus" de ces valeurs à tout moment. Les files d'attente prioritaires dans C++ STL utilisent une structure de tas en interne, qui à son tour est essentiellement soutenue par un tableau; ainsi, cela va généralement au-dessus d'un vecteur .

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

61
répondu Platinum Azure 2014-10-06 13:48:34

La définition technique de "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 itérer à travers 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 stockant des objets d'une manière différente et fournissant des caractéristiques de performance différentes, mais tous ont une interface standard afin que vous puissiez échanger facilement et sans trop modifier le code qui utilise le conteneur. L'idée est que les contenants sont conçus pour être interchangeables autant que possible.

Les adaptateurs de conteneur sont des classes qui fournissent un sous-ensemble fonctionnalité du conteneur, mais peut 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 un appel 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 le plus standard push, top, et pop fonctions membres pour accéder aux membres.

6
répondu James McNellis 2010-10-06 15:10:00