首页 > 后端开发 > C++ > 如何在 C 中使用基于范围的 for 循环迭代向量时获取元素的索引?

如何在 C 中使用基于范围的 for 循环迭代向量时获取元素的索引?

Susan Sarandon
发布: 2024-12-05 03:18:11
原创
933 人浏览过

How can I get the index of an element while iterating through a vector using a range-based for loop in C  ?

使用基于范围的 For 循环进行索引提取

在 C 编程中,基于范围的 for 循环提供了一种迭代元素的简洁方法一个容器的。然而,有时需要在迭代过程中确定当前元素的索引,而不依赖于额外的迭代器。

问题:

给定一个值向量和基于范围的 for 循环如下所示:

vector<int> list;
for(auto& elem:list) {
    int i = elem;
}
登录后复制

有没有办法找到向量中 elem 的位置而不需要维护一个单独的迭代器?

解决方案:

是的,可以在迭代基于范围的 for 循环时提取索引。此技术涉及模板化结构和迭代器的组合:

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

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

    private:
        size_t _pos;
        inner_iterator _it;
    };

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

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

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

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

此代码片段提供了在同时捕获索引和值的同时迭代容器的能力。 Indexer 类包装容器并提供一个自定义迭代器,该迭代器生成索引和元素引用对。

用法示例:

要在范围内使用 Indexer 类 -基于 for 循环,您可以执行以下操作:

#include <iostream>
#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";
    }
}
登录后复制

在此示例中,循环将打印向量的每个元素及其索引:

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板