기존 반복자는 단일 컨테이너의 요소를 탐색하지만 때로는 외부 컨테이너의 각 요소가 별도의 컨테이너를 나타내는 중첩된 컨테이너를 만나기도 합니다. 수집. 모든 요소를 순차적으로 순회하려면 중첩된 구조를 "평면화"하는 메커니즘이 필요합니다.
여기서 평탄화 반복자가 작동합니다. 여러 수준의 컨테이너를 원활하게 결합하여 하나의 응집력 있는 시퀀스로 표시합니다. 마치 단일 컨테이너에 모두 포함된 것처럼 표준 범위 기반 루프를 사용하여 평면화된 요소를 반복할 수 있습니다.
기본 제공 구현은 없지만 주요 C 라이브러리에서는 예제 구현을 만들 수 있습니다.
#include <iterator> template <typename OuterIterator> class flattening_iterator { public: using outer_iterator = OuterIterator; using inner_iterator = typename OuterIterator::value_type::iterator; using iterator_category = std::forward_iterator_tag; using value_type = typename inner_iterator::value_type; flattening_iterator() {} 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) { if (outer_it_ == outer_end_) return; inner_it_ = outer_it_->begin(); advance_past_empty_inner_containers(); } reference operator*() const { return *inner_it_; } pointer operator->() const { return &*inner_it_; } flattening_iterator& operator++() { ++inner_it_; if (inner_it_ == outer_it_->end()) advance_past_empty_inner_containers(); return *this; } flattening_iterator operator++(int) { flattening_iterator it(*this); ++*this; return it; } friend bool operator==(const flattening_iterator& a, const flattening_iterator& b) { if (a.outer_it_ != b.outer_it_) return false; if (a.outer_it_ != a.outer_end_ && b.outer_it_ != b.outer_end_ && a.inner_it_ != b.inner_it_) return false; return true; } friend bool operator!=(const flattening_iterator& a, const flattening_iterator& b) { return !(a == b); } private: void advance_past_empty_inner_containers() { 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_; };
이 평면화 반복자를 사용하려면 평면화 기능을 활용할 수 있습니다. 템플릿:
template <typename Iterator> flattening_iterator<Iterator> flatten(Iterator it) { return flattening_iterator<Iterator>(it, it); } template <typename Iterator> flattening_iterator<Iterator> flatten(Iterator first, Iterator last) { return flattening_iterator<Iterator>(first, last); }
다음 중첩 컨테이너를 고려하세요.
std::unordered_set<std::vector<int>> s; s.insert(std::vector<int>()); s.insert({ 1, 2, 3, 4, 5 }); s.insert({ 6, 7, 8 }); s.insert({ 9, 10, 11, 12 });
평탄화 반복자를 활용하면 모든 숫자를 원활하게 반복할 수 있습니다.
for (auto it(flatten(s.begin(), s.end())); it != s.end(); ++it) { std::cout << *it << endl; // prints 1, 2, 3, ..., 12 }
평탄화 반복자는 중첩된 컨테이너를 선형 방식으로 탐색하는 효율적이고 우아한 방법을 제공합니다. 이 접근 방식을 사용하면 복잡한 중첩 루프나 수동 인덱스 관리가 필요하지 않습니다. 표준 라이브러리의 일부는 아니지만 이 구현을 코드베이스에 쉽게 통합하여 유연성을 높이고 가독성을 높일 수 있습니다.
위 내용은 중첩된 컨테이너에 대한 반복을 단순화하기 위해 C에서 평면화 반복자를 어떻게 만들 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!