在基於範圍的For 循環中查找當前物件的索引
在基於範圍的for 循環中,迭代容器直接提供對每個元素的訪問,而不需要顯式迭代器。然而,可能會出現這樣的情況:需要確定循環中當前元素的索引而不依賴單獨的迭代器。本題探討了一種使用組合和專門的拉鍊技術來實現這一目標的方法。
拉鍊技術
這種方法的關鍵在於用一路上的索引。拉鍊類別旨在建立類似迭代器的對象,該對象提供對容器中元素的索引和值的存取。此拉鍊有效地充當原始容器迭代器的包裝器。
實作
提供的C 程式碼示範了此技術:
template <typename T> struct iterator_extractor { typedef typename T::iterator type; }; template <typename T> struct iterator_extractor<T const> { typedef typename T::const_iterator type; }; template <typename T> class Indexer { public: class iterator { typedef typename iterator_extractor<T>::type inner_iterator; typedef typename std::iterator_traits<inner_iterator>::reference inner_reference; public: typedef std::pair<size_t, inner_reference> reference; iterator(inner_iterator it): _pos(0), _it(it) {} reference operator*() const { return reference(_pos, *_it); } iterator& operator++() { ++_pos; ++_it; return *this; } iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; } bool operator==(iterator const& it) const { return _it == it._it; } bool operator!=(iterator const& it) const { return !(*this == it); } private: size_t _pos; inner_iterator _it; }; Indexer(T& t): _container(t) {} iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; }; // class Indexer template <typename T> Indexer<T>> index(T& t) { return Indexer<T>>(t); }
This程式碼定義了一個Indexer 類,它為給定的容器T 建立一個索引迭代器。迭代器類別提供包含索引的對的參考和元素的值。 index 函數傳回一個 Indexer 對象,可在基於範圍的 for 迴圈中使用該物件來存取索引和值。
用法
使用此技術,只需使用索引函數將向量壓縮為一系列整數:
#include <iostream> #include <iterator> #include <limits> #include <vector> int main() { std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto p: index(v)) { std::cout << p.first << ": " << p.second << "\n"; } }
在此範例中,索引p 變數迭代向量v 的元素,提供對索引和值的存取。然後您可以在循環中輕鬆存取這些值。
以上是如何在基於 C 範圍的 For 迴圈中取得目前元素的索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!