迭代嵌套容器通常是一项繁琐且容易出错的任务。为了简化这个过程,我们探索“扁平化”迭代器的概念,它允许我们将容器的层次结构视为单个扁平序列。
假设我们有一个集合包含整数的向量,我们希望将它们作为单个连续列表进行迭代。一个简单的 std::vector<:vector>> ;可能还不够,因为它需要单独导航每个嵌套向量。
为了解决这个问题,我们可以创建一个自定义迭代器,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中文网其他相关文章!