Maison > développement back-end > C++ > Comment puis-je obtenir des indices d'éléments dans des boucles For basées sur une plage C ?

Comment puis-je obtenir des indices d'éléments dans des boucles For basées sur une plage C ?

Barbara Streisand
Libérer: 2024-12-31 02:09:11
original
847 Les gens l'ont consulté

How Can I Get Element Indices in C   Range-Based For Loops?

Recherche des positions des éléments dans des boucles For basées sur une plage

En programmation, il est souvent nécessaire de déterminer l'index ou la position des éléments itérés sur. Lors de l'utilisation de boucles for basées sur une plage, qui offrent un moyen pratique de parcourir les conteneurs, la question se pose de savoir s'il est possible de récupérer l'index de l'élément actuel sans utiliser un itérateur séparé.

Solutions

1. Technique de fermeture éclair

Une méthode consiste à utiliser une technique appelée fermeture éclair. Cela implique de combiner le conteneur avec un index en cours de route, créant une nouvelle plage de paires où chaque paire est constituée de l'index et de l'élément correspondant.

struct Indexer {
  class iterator {
    iterator(typename T::iterator it): _pos(0), _it(it) {}
    std::pair<size_t, typename T::reference> operator*() const { return std::make_pair(_pos, *_it); }
    // ...
  };
  iterator begin() const { return iterator(_container.begin()); }
  iterator end() const { return iterator(_container.end()); }
private:
  T& _container;
};
Copier après la connexion

En utilisant la classe Indexer, il devient possible d'itérer sur des conteneurs et obtenez simultanément l'index et l'élément.

2. Boost.Range

Une autre option consiste à utiliser la bibliothèque Boost.Range. Plus précisément, l'adaptateur boost::adaptors::indexed peut être utilisé pour créer une plage dérivée qui inclut à la fois l'index et l'élément pour chaque itération.

std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto const& [idx, elem]: boost::adaptors::indexed(v)) {
  std::cout << idx << ": " << elem << "\n";
}
Copier après la connexion

En itérant sur la plage résultante obtenue à partir de boost : :adaptors::indexed, l'index et l'élément sont accessibles dans la boucle for.

3. Itérateur personnalisé

Dans certains scénarios, il peut être souhaitable de créer un itérateur personnalisé qui conserve l'index actuel. Cet itérateur peut être utilisé conjointement avec des boucles for basées sur une plage pour accéder à la fois à l'index et à l'élément.

class IndexedIterator {
private:
  container_type* _container;
  size_t _index;
public:
  IndexedIterator(container_type* c) : _container(c), _index(0) {}
  bool operator!=(const IndexedIterator& other) const { return _container != other._container || _index != other._index; }
  std::pair<size_t, value_type> operator*() const { return std::make_pair(_index, *_container[_index]); }
  IndexedIterator& operator++() { _index++; return *this; }
};
Copier après la connexion

En définissant un itérateur personnalisé et en l'adaptant au type d'itérateur du conteneur, il est possible d'obtenir l'élément et son index directement dans la boucle for.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal