首页 > 后端开发 > C++ > 如何在基于 C 范围的 For 循环中获取当前元素的索引?

如何在基于 C 范围的 For 循环中获取当前元素的索引?

Barbara Streisand
发布: 2024-11-29 07:43:09
原创
812 人浏览过

How Can I Get the Index of the Current Element in a C   Range-Based For Loop?

在基于范围的 For 循环中查找当前对象的索引

在基于范围的 for 循环中,迭代容器直接提供对每个元素的访问,而不需要显式迭代器。然而,可能会出现这样的情况:需要确定循环中当前元素的索引而不依赖于单独的迭代器。本题探讨了一种使用组合和专门的拉链技术来实现这一目标的方法。

拉链技术

这种方法的关键在于用一路上的索引。拉链类旨在创建类似迭代器的对象,该对象提供对容器中元素的索引和值的访问。此拉链有效地充当原始容器迭代器的包装器。

实现

提供的 C 代码演示了此技术:

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 {
        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&amp; operator++() { ++_pos; ++_it; return *this; }
        iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }

        bool operator==(iterator const&amp; it) const { return _it == it._it; }
        bool operator!=(iterator const&amp; it) const { return !(*this == it); }

    private:
        size_t _pos;
        inner_iterator _it;
    };

    Indexer(T&amp; t): _container(t) {}

    iterator begin() const { return iterator(_container.begin()); }
    iterator end() const { return iterator(_container.end()); }

private:
    T&amp; _container;
}; // class Indexer

template <typename T>
Indexer<T>> index(T&amp; t) { return Indexer<T>>(t); }
登录后复制

This代码定义了一个 Indexer 类,它为给定的容器 T 创建一个索引迭代器。迭代器类提供对包含索引的对的引用和元素的值。 index 函数返回一个 Indexer 对象,可在基于范围的 for 循环中使用该对象来访问索引和值。

用法

使用此技术,只需使用索引函数将向量压缩为一系列整数:

#include <iostream>
#include <iterator>
#include <limits>
#include <vector>

int main() {
    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";
    }
}
登录后复制

在此示例中,索引 p 变量迭代向量 v 的元素,提供对索引和值的访问。然后您可以在循环中轻松访问这些值。

以上是如何在基于 C 范围的 For 循环中获取当前元素的索引?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板