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

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

Patricia Arquette
发布: 2024-12-09 17:12:10
原创
239 人浏览过

How to Get the Index of an Element in a C   Range-Based For Loop?

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

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