基於範圍的 for 迴圈是迭代一系列值的便利語法。但是,它沒有提供存取循環內當前物件索引的方法。如果您需要根據物件在容器中的位置對物件執行操作,這可能會出現問題。
幸運的是,有一種方法可以找到當前物件的索引,而無需維護單獨的迭代器。訣竅是使用構圖技術。我們可以使用索引來「壓縮」它,而不是直接迭代容器。
它的工作原理如下:
拉鍊代碼是一個創建新迭代器類型的類,該迭代器類型包裝原始迭代器並添加索引字段。 iterator_extractor 結構用於從容器中提取底層迭代器類型。
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); }
要使用 Zipper 程式碼,只需將容器包裝在索引器函數中並進行迭代在結果迭代器範圍內。迭代器將提供當前物件的索引和值。
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"; }
這將輸出:
0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9
而拉鍊代碼是一個強大的工具,用於在基於範圍的 for在循環中尋找目前物件的索引,還有一些替代方法可能更適合某些情況
單獨的迭代器:維護單獨的迭代器可以更直接地控制迭代過程。您可以使用迭代器明確地尋找目前物件的索引或對容器執行其他操作。
Boost.Range:Boost.Range 函式庫提供了許多工具操作範圍,包括索引適配器。索引適配器可用於建立一個迭代器範圍,將原始範圍中的每個元素與其索引配對。
自訂範圍類:您可以建立自己的自訂範圍類,它提供包含目前物件索引的迭代器。這種方法為您提供了控制迭代過程的最大靈活性。
有多個選項可用於在基於範圍的 for 迴圈中尋找目前物件的索引。您的應用程式的最佳選擇將取決於具體要求和所涉及的權衡。
以上是如何在 C 基於範圍的 For 迴圈中取得目前物件的索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!