如何在基于范围的 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中文网其他相关文章!