> 백엔드 개발 > C++ > 사용자 정의 반복자가 중첩된 컨테이너를 통한 반복을 어떻게 단순화할 수 있습니까?

사용자 정의 반복자가 중첩된 컨테이너를 통한 반복을 어떻게 단순화할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-11-26 05:36:09
원래의
706명이 탐색했습니다.

How Can a Custom Iterator Simplify Iterating Through Nested Containers?

사용자 정의 반복자를 사용하여 중첩 컨테이너 평면화

소개

중첩 컨테이너를 반복하는 것은 지루하고 오류가 발생하기 쉬운 작업인 경우가 많습니다. 이 프로세스를 단순화하기 위해 컨테이너 계층을 단일 평면 시퀀스로 처리할 수 있는 "평면화" 반복기의 개념을 탐구합니다.

문제

세트가 있다고 가정합니다. 정수를 포함하는 벡터로 구성되어 있으며 이를 하나의 연속된 목록으로 반복하려고 합니다. 간단한 std::벡터> 중첩된 각 벡터를 개별적으로 탐색해야 하기 때문에 충분하지 않을 수 있습니다.

사용자 정의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿