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

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

Patricia Arquette
Patricia Arquette原创
2024-12-09 17:12:10293浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn