티스토리 뷰

iterator : 컨테이너에 저장된 원소를 순회하고 접근하는 일반화된 방법을 제공합니다.


iterator 를 말할때 항상 빠지지 않는 내용이 container 입니다.


**반복자
임의의 컨테이너의 알고리즘을 몰라도 순회를 이어주는 매개 역할을 합니다.

즉, vector, linkedlist 유사한 컨테이너임에도 물리적 자료구조가 전혀 다른 container로 순회하는 방법이 아주 다릅니다. 이렇게 제 각각인 container 들에 대해 순회 방법을 일반화하기 위해 STL 에서 사용하는 개념이 바로 반복자 입니다.


custom container 를 구현한다고 했을 때, 가장 많이 사용하는 방법이 std::iterator를 상속받아 inner class로 구현하는 방식 입니다. 우선 custom container 를 구현하여 iteration 순회 및 c++11 의 range based for loop 가 동작하도록 구현해보겠습니다.






// custom container with inner iterator class #include <iostream> #include <algorithm> template<class T> class rkvector { int _size = 0; T* _buffer = nullptr; public: /* template< class Category, class T, class Distance = std::ptrdiff_t,(depressed c++17) class Pointer = T*, class Reference = T& > struct iterator; */ // inner iterator class class iterator : std::iterator<std::input_iterator_tag, T> { T* _ptr; public: explicit iterator(T* ptr) :_ptr(ptr) {} // ++ 연산자 경우 직접적인 값이 아니라 iterator 를 반환 // * 연산자를 통해서만 직접적인 값을 반환 iterator& operator++() { ++_ptr; return (*this); } iterator operator++(int) { iterator retval = *this; ++_ptr; return retval; } reference operator*() { return *_ptr; } bool operator==(iterator other) const { return _ptr == other._ptr; } bool operator!=(iterator other) const { return _ptr != other._ptr; } }; // 생성자 rkvector() {} rkvector(int size) { if (_buffer == nullptr) { std::cout << "dynamic allocate" << std::endl; _buffer = new T[size]; // T() <-어떤 의미 일까요? std::fill(_buffer, _buffer + size, T()); _size = size; } } // 소멸자 ~rkvector() { if (_size > 1) delete _buffer; else delete[] _buffer; } int size() const { return _size; } T operator[](int index) const { return _buffer[index]; } iterator begin() { return iterator(_buffer); } iterator end() { return iterator(_buffer + _size); } void fill(T&& val) { for (int i = 0; i < _size;++i) _buffer[i] = val; } }; int main() { rkvector<int> vec(5); vec.fill(20); for (rkvector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << std::endl; } std::cout << "C++11 range based for loop" << std::endl; for (int element : vec) { std::cout << element << std::endl; } return 0; } // road


STL vector 의 iterator 가 위와 같이 구현이 가능합니다.

C++11 ragne based for loop 가 지원됨에 따라서 바로 for( : ) 문을 통해서도 순회가 가능하게 바뀌었습니다.


>> 출력 값

dynamic allocate

20

20

20

20

20

C++11 range based for loop

20

20

20

20

20

'프로그래밍 > Design pattern(C++)' 카테고리의 다른 글

Visitor pattern (c++)  (0) 2017.05.07
Strategy pattern (c++)  (0) 2017.05.05
Singleton pattern (c++)  (0) 2017.04.26
Design Patterns  (0) 2017.04.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함