티스토리 뷰
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
링크
TAG
- tensorflow serving
- Residual Block
- flask serving
- 캡처방지
- 네이버웹툰
- implementation
- backpropagation
- DW
- keras
- dct
- gPRC
- SvD
- numpy
- Digital watermarking
- DWT-DCT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함