Heim > Backend-Entwicklung > C++ > Wie kann ich Elementindizes in bereichsbasierten C-For-Schleifen abrufen?

Wie kann ich Elementindizes in bereichsbasierten C-For-Schleifen abrufen?

Barbara Streisand
Freigeben: 2024-12-31 02:09:11
Original
847 Leute haben es durchsucht

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

Elementpositionen in bereichsbasierten For-Schleifen finden

Bei der Programmierung ist es oft notwendig, den Index oder die Position von Elementen zu bestimmen, die iteriert werden über. Bei der Verwendung bereichsbasierter for-Schleifen, die eine bequeme Möglichkeit zum Durchlaufen von Containern bieten, stellt sich die Frage, ob es möglich ist, den Index des aktuellen Elements abzurufen, ohne einen separaten Iterator zu verwenden.

Lösungen

1. Reißverschlusstechnik

Eine Methode besteht darin, eine Technik namens Reißverschluss zu verwenden. Dabei wird der Container mit einem Index kombiniert und ein neuer Bereich von Paaren erstellt, wobei jedes Paar aus dem Index und dem entsprechenden Element besteht.

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;
};
Nach dem Login kopieren

Durch die Verwendung der Indexer-Klasse wird eine Iteration möglich über Container und erhalten Sie gleichzeitig den Index und das Element.

2. Boost.Range

Eine weitere Option ist die Verwendung der Boost.Range-Bibliothek. Konkret kann der boost::adaptors::indexed-Adapter verwendet werden, um einen abgeleiteten Bereich zu erstellen, der sowohl den Index als auch das Element für jede Iteration enthält.

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";
}
Nach dem Login kopieren

Durch Iteration über den resultierenden Bereich, der von boost erhalten wird: :adaptors::indexed, auf den Index und das Element kann innerhalb der for-Schleife zugegriffen werden.

3. Benutzerdefinierter Iterator

In bestimmten Szenarien kann es wünschenswert sein, einen benutzerdefinierten Iterator zu erstellen, der den aktuellen Index verwaltet. Dieser Iterator kann in Verbindung mit bereichsbasierten for-Schleifen verwendet werden, um sowohl auf den Index als auch auf das Element zuzugreifen.

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; }
};
Nach dem Login kopieren

Durch die Definition eines benutzerdefinierten Iterators und dessen Anpassung an den Iteratortyp des Containers ist es möglich, Folgendes zu erhalten: das Element und seinen Index direkt innerhalb der for-Schleife.

Das obige ist der detaillierte Inhalt vonWie kann ich Elementindizes in bereichsbasierten C-For-Schleifen abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage