음악, 삶, 개발
vector 의 range based for loop 는 객체다. 본문
코멘트를 읽어보세요.
아래의 문법을 외워야한다.
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 명을 내가 원하는 이름으로 변경하는것도 포인트다.