首页  >  文章  >  后端开发  >  自定义迭代器如何简化嵌套容器的迭代?

自定义迭代器如何简化嵌套容器的迭代?

Patricia Arquette
Patricia Arquette原创
2024-11-26 05:36:09621浏览

How Can a Custom Iterator Simplify Iterating Through Nested Containers?

使用自定义迭代器展平嵌套容器

简介

迭代嵌套容器通常是一项繁琐且容易出错的任务。为了简化这个过程,我们探索“扁平化”迭代器的概念,它允许我们将容器的层次结构视为单个扁平序列。

问题

假设我们有一个集合包含整数的向量,我们希望将它们作为单个连续列表进行迭代。一个简单的 std::vector<:vector>> ;可能还不够,因为它需要单独导航每个嵌套向量。

自定义 flattening_iterator

为了解决这个问题,我们可以创建一个自定义迭代器,flattening_iterator,它按顺序迭代嵌套容器。此迭代器:

  • 将最外层容器的迭代器作为其输入。
  • 跟踪最外层和最内层容器中的当前位置。
  • 前进迭代器通过逐步移动嵌套容器直到到达末尾或遇到空的最内层

实现

flattening_iterator 实现如下:

template <typename OuterIterator>
class flattening_iterator
{
public:
    // ... iterator category, value type, etc.
    
    flattening_iterator(outer_iterator it) : outer_it_(it), outer_end_(it) { }
    flattening_iterator(outer_iterator it, outer_iterator end) : outer_it_(it), outer_end_(end) { advance_past_empty_inner_containers(); }
    
    // ... operators for comparison, dereferencing, and advancement
    
private:
    void advance_past_empty_inner_containers()
    {
        // Advance until we find a non-empty innermost container
        while (outer_it_ != outer_end_ && inner_it_ == outer_it_->end())
        {
            ++outer_it_;
            if (outer_it_ != outer_end_)
                inner_it_ = outer_it_->begin();
        }
    }
    
    outer_iterator outer_it_;
    outer_iterator outer_end_;
    inner_iterator inner_it_;
};

用法

我们可以使用 flattening_iterator 来展平嵌套容器作为如下:

std::unordered_set<std::vector<int>> s;

s.insert({});
s.insert({1,2,3,4,5});
s.insert({6,7,8});
s.insert({9,10,11,12});

// Create a flattening iterator and iterate over the flattened set
for (auto it = flatten(s.begin()); it != s.end(); ++it)
{
    std::cout << *it << endl;
}

这将输出嵌套容器中所有整数的展平列表:

1
2
3
4
5
6
7
8
9
10
11
12

结论

flattening_iterator 提供了一种简单有效的方法将嵌套容器作为单个扁平序列进行迭代。这简化了代码并消除了复杂的嵌套循环结构或通过嵌套层次结构进行手动导航的需要。

以上是自定义迭代器如何简化嵌套容器的迭代?的详细内容。更多信息请关注PHP中文网其他相关文章!

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