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

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

Barbara Streisand
发布: 2024-12-31 02:09:11
原创
847 人浏览过

How Can I Get Element Indices in C   Range-Based For Loops?

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

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