음악, 삶, 개발

vector 의 range based for loop 는 객체다. 본문

카테고리 없음

vector 의 range based for loop 는 객체다.

Lee_____ 2020. 10. 24. 05:33

코멘트를 읽어보세요.

아래의 문법을 외워야한다.

int main () {
    
    std::vector<int> vec {1, 2, 3, 4};
    
    for (auto i : vec) {}           // 객체를 읽으려할때    (복사)
    for (const auto& i : vec) {}    // 객체를 읽으려할때    (const 참조)
    for (auto& i : vec) {}          // 객체를 수정하려할때   (참조)
    
    return 0;
    
}

rante for loop 안에 변수를 iterator 라고 생각하는 사람이 있는데,

그렇지않고 객체다.  (내부적으로 iterator 를 사용하고있는 문법일뿐)

const 나 & 를 붙여줌에 따라, 참조인지 복사인지가 구별된다.

위와 같이 int 가 아닌, 나의 클래스를 ranged for loop 하고자할때는

나의 클래스안에 begin(), end(), cbegin(), cend() 가 정의되어야한다

 

아래는 예제.

class Sequencer {

    public :
    
        /* Do Range Based For Loop! (Have Iterators!) */
        using NoteIterator      = std::vector<Note>::iterator;
        using ConstNoteIterator = std::vector<Note>::const_iterator;
        
        NoteIterator        begin()            { return seq.begin();   }
        ConstNoteIterator   begin()    const   { return seq.cbegin();  }
        NoteIterator        end()              { return seq.end();     }
        ConstNoteIterator   end()      const   { return seq.cend();    }
                
    private :
        
        std::vector<Note> seq;

};

const_iterator 를 반환하는 cbegin() 을 호출하는 begin() 뒤에는 const 를 붙여주도록한다. 

또한 using 을 사용하여 긴 type 명을 내가 원하는 이름으로 변경하는것도 포인트다.