중첩 컨테이너를 반복하는 것은 지루하고 오류가 발생하기 쉬운 작업인 경우가 많습니다. 이 프로세스를 단순화하기 위해 컨테이너 계층을 단일 평면 시퀀스로 처리할 수 있는 "평면화" 반복기의 개념을 탐구합니다.
세트가 있다고 가정합니다. 정수를 포함하는 벡터로 구성되어 있으며 이를 하나의 연속된 목록으로 반복하려고 합니다. 간단한 std::벡터
이 문제를 해결하기 위해 중첩된 컨테이너를 순차적으로 반복하는 사용자 정의 반복자 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!