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