Maison  >  Article  >  développement back-end  >  Pouvez-vous accéder aux conteneurs sous-jacents des adaptateurs de conteneurs STL ?

Pouvez-vous accéder aux conteneurs sous-jacents des adaptateurs de conteneurs STL ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 17:47:02307parcourir

Can You Access the Underlying Containers of STL Container Adaptors?

Accéder aux conteneurs sous-jacents des adaptateurs de conteneurs STL

La bibliothèque STL fournit divers adaptateurs de conteneurs, tels que des piles, des files d'attente et des files d'attente prioritaires. Ces adaptateurs offrent une interface pour interagir avec les conteneurs sous-jacents, mais la question se pose : existe-t-il un moyen standardisé d'accéder à cette couche cachée ?

Absence de méthode d'accès standard

Malheureusement, la STL ne définit pas de méthode standard pour récupérer le conteneur natif de pile, de file d'attente ou de priorité_queue. La fonction _Get_container() disponible dans certaines implémentations, comme VS2008, est spécifique à la plate-forme et ne fait pas partie du standard C.

Accès aux conteneurs sous-jacents

Une solution de contournement consiste à définissez des modèles personnalisés qui acceptent l'adaptateur de conteneur souhaité et extrayez le conteneur sous-jacent à l'aide de la spécialisation de modèle. Par exemple, cette approche peut être utilisée pour les adaptateurs de pile et de file d'attente :

<code class="cpp">template<typename T>
using Deque = std::deque<T>;
template<typename T>
using Stack = std::stack<T, Deque<T>>;
template<typename T>
std::ostream& operator<<(std::ostream& os, const Stack<T>& s) {
  // Output the contents of the underlying deque
  os << "[";
  for (const auto& elem : s.container()) {
    os << " " << elem;
  }
  os << " ]";
  return os;
}

Accès à la file d'attente prioritaire

L'accès au conteneur sous-jacent d'une file d'attente prioritaire est plus difficile en raison à sa mise en œuvre interne. Cependant, une solution astucieuse consiste à définir une sous-classe imbriquée avec accès au membre du conteneur privé :

<code class="cpp">template <typename T, typename S, typename C>
struct PriorityHack : private priority_queue<T, S, C> {
  using priority_queue<T, S, C>::c;
};
template <typename T, typename S, typename C>
S& container(priority_queue<T, S, C>& pq) {
  return PriorityHack<T, S, C>::c(pq);
}</code>

Cela vous permet d'obtenir le conteneur natif d'une file d'attente prioritaire en utilisant :

<code class="cpp">priority_queue<int> pq;
vector<int>& tasks = container(pq); // Assign the underlying vector to tasks</code>

Cette solution fournit une approche standardisée pour accéder aux conteneurs sous-jacents des adaptateurs de pile, de file d'attente et de priorité_queue, quelle que soit la plate-forme de mise en œuvre.

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