在基於範圍的 For 循環中尋找元素位置
在程式設計中,經常需要確定被迭代元素的索引或位置超過。使用基於範圍的 for 迴圈(它提供了一種方便的方法來迭代容器)時,會出現問題:是否可以在不使用單獨的迭代器的情況下檢索當前元素的索引。
解
1。拉鍊技術
一種方法涉及使用一種稱為拉鍊的技術。這涉及到將容器與索引結合起來,創建一個新的對範圍,其中每對由索引和相應的元素組成。
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; };
透過使用 Indexer 類,可以進行迭代遍歷容器並同時取得索引和元素。
2. Boost.Range
另一個選項涉及利用 Boost.Range 庫。具體來說, boost::adaptors::indexed 適配器可用於建立派生範圍,其中包括每次迭代的索引和元素。
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"; }
透過迭代從 boost 獲得的結果範圍: :adaptors::indexed,可以在for循環中存取索引和元素。
3.自訂迭代器
在某些情況下,可能需要建立一個維護目前索引的自訂迭代器。此迭代器可以與基於範圍的 for 迴圈結合使用來存取索引和元素。
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; } };
透過定義自訂迭代器並使其適應容器的迭代器類型,可以獲得元素及其索引直接在 for 迴圈中。
以上是如何在基於 C 範圍的 For 迴圈中取得元素索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!