Maison >développement back-end >C++ >Comment puis-je créer un itérateur d'aplatissement pour les conteneurs imbriqués en C ?

Comment puis-je créer un itérateur d'aplatissement pour les conteneurs imbriqués en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-29 13:23:10987parcourir

How Can I Create a Flattening Iterator for Nested Containers in C  ?

Aplatir un itérateur

Les itérateurs sont essentiels pour naviguer dans les collections de données. Cependant, dans certaines situations, vous pouvez rencontrer des conteneurs de conteneurs, ce qui rend difficile l'itération sur l'ensemble de la structure en un seul passage. Dans de tels cas, un « itérateur d'aplatissement » peut simplifier le processus.

Itérateurs d'aplatissement

Un itérateur d'aplatissement présente un conteneur de conteneurs comme une séquence unique et aplatie d'éléments . Cela vous permet de parcourir tous les éléments consécutivement, quelle que soit leur imbrication d'origine.

Manque d'implémentations intégrées

Malgré l'utilité de l'aplatissement des itérateurs, il existe Il n'y a pas beaucoup d'implémentations préexistantes dans les grandes bibliothèques comme Boost. Par conséquent, plongeons-nous dans une implémentation de base qui comble cette lacune.

Une implémentation personnalisée

L'implémentation fournie, flattening_iterator, est un itérateur direct qui « aplatit » n'importe quel conteneur. de conteneurs. Il fonctionne en itérant dans le conteneur externe et en itérant de manière récursive dans tous les conteneurs imbriqués. Pour gérer les conteneurs internes vides, la fonction advance_past_empty_inner_containers garantit que l'itérateur les ignore.

Utilisation

La fonction flatten vous permet de construire facilement un itérateur d'aplatissement pour un conteneur donné. de conteneurs. Voici un cas de test minimal :

#include <algorithm>
#include <iostream>
#include <set>
#include <vector>

using namespace std;

int main() {
  // Generate some test data
  vector<vector<int>> v(3);
  int i(0);
  for (auto it(v.begin()); it != v.end(); ++it) {
    it->push_back(i++);
    it->push_back(i++);
    it->push_back(i++);
    it->push_back(i++);
  }

  // Flatten the data and print all the elements
  for (auto it(flatten(v.begin(), v.end())); it != v.end(); ++it) {
    cout << *it << ", ";
  }
  cout << "\n";

  // Using standard library algorithms
  copy(flatten(v.begin(), v.end()), flatten(v.end()),
      ostream_iterator<int>(cout, ", "));

  return 0;
}

Limitations

Bien que cette implémentation soit fonctionnelle, il convient de noter qu'elle n'a pas été testée de manière approfondie. Si vous rencontrez des bugs, veuillez les signaler afin qu'ils puissent être corrigés.

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