如何在基於範圍的for 循環中確定物件的索引
在基於範圍的for 循環中,通常會出現以下情況:希望存取容器內目前元素的索引。考慮以下程式碼:
vector<int> list; for (auto& elem : list) { int i = elem; }
在這種情況下,您可能想知道 elem 在列表向量中的位置,而不需要維護單獨的迭代器。
基於 Zipper 的方法
為了實現這一點,可以採用「拉鍊」方法。您可以使用索引對其進行“壓縮”,而不是直接在容器上進行迭代。
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 { public: typedef std::pair<size_t, typename iterator_extractor<T>::type::reference> reference; iterator(typename iterator_extractor<T>::type 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==(const iterator& it) const { return _it == it._it; } bool operator!=(const iterator& it) const { return !(*this == it); } private: size_t _pos; typename iterator_extractor<T>::type _it; }; Indexer(T& t) : _container(t) {} iterator begin() const { return iterator(_container.begin()); } iterator end() const { return iterator(_container.end()); } private: T& _container; }; template <typename T> Indexer<T>& index(T& t) { return Indexer<T>(t); }
此程式碼建立一個 Indexer 類,該類別提供一個迭代器,該迭代器將元素及其索引組合成一對。透過使用此索引器,您可以同時存取索引和元素。
使用範例
以下程式碼示範如何使用拉鍊方法:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; for (auto p : index(v)) { cout << p.first << ": " << p.second << "\n"; } return 0; }
此程式碼將以以下格式列印索引和元素值:
0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9
以上是如何在基於 C 範圍的 For 迴圈中取得元素的索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!