std::tr1::array
coder story/C/C++ 2010/03/19 11:29. std::tr1::array 이란?
. 내부 구조는 기존 배열과 동일하지만 std::algorithm 에 적용하기 쉽게 랩핑되어 있습니다.
1: // TEMPLATE CLASS array2: template<class _Ty,3: size_t _Size>4: class array5: { // fixed size array of values6: public:7: enum {_EEN_SIZE = _Size}; // helper for expression evaluator8:9: typedef array<_Ty, _Size> _Myt;10: typedef _Ty value_type;11: typedef size_t size_type;12: typedef ptrdiff_t difference_type;13: typedef _Ty *pointer;14: typedef const _Ty *const_pointer;15: typedef _Ty& reference;16: typedef const _Ty& const_reference;17:18: typedef _Array_iterator<_Ty, _Size> iterator;19: typedef _Array_const_iterator<_Ty, _Size> const_iterator;20:21: typedef std::reverse_iterator<iterator> reverse_iterator;22: typedef std::reverse_iterator<const_iterator> const_reverse_iterator;23:24: void assign(const _Ty& _Value)25: { // assign value to all elements26: std::fill_n(_Elems, _Size, _Value);27: }28:29: void swap(_Myt& _Other)30: { // swap contents with _Other31: std::swap_ranges(_Other.begin(), _Other.end(), begin());32: }33:34: iterator begin()35: { // return iterator for beginning of mutable sequence36: return (iterator(&_Elems[0], 0));37: }38:39: const_iterator begin() const40: { // return iterator for beginning of nonmutable sequence41: return (const_iterator((pointer)&_Elems[0], 0));42: }43:44: iterator end()45: { // return iterator for end of mutable sequence46: return (iterator(&_Elems[0], _Size));47: }48:49: const_iterator end() const50: { // return iterator for beginning of nonmutable sequence51: return (const_iterator((pointer)&_Elems[0], _Size));52: }53:54: reverse_iterator rbegin()55: { // return iterator for beginning of reversed mutable sequence56: return (reverse_iterator(end()));57: }58:59: const_reverse_iterator rbegin() const60: { // return iterator for beginning of reversed nonmutable sequence61: return (const_reverse_iterator(end()));62: }63:64: reverse_iterator rend()65: { // return iterator for end of reversed mutable sequence66: return (reverse_iterator(begin()));67: }68:69: const_reverse_iterator rend() const70: { // return iterator for end of reversed nonmutable sequence71: return (const_reverse_iterator(begin()));72: }73:74: size_type size() const75: { // return length of sequence76: return (_Size);77: }78:79: size_type max_size() const80: { // return maximum possible length of sequence81: return (_Size);82: }83:84: bool empty() const85: { // test if sequence is empty86: return (_Size == 0);87: }88:89: reference at(size_type _Pos)90: { // subscript mutable sequence with checking91: if (_Size <= _Pos)92: _Xoutrange();93: return (_Elems[_Pos]);94: }95:96: const_reference at(size_type _Pos) const97: { // subscript nonmutable sequence with checking98: if (_Size <= _Pos)99: _Xoutrange();100: return (_Elems[_Pos]);101: }102:103: reference operator[](size_type _Pos)104: { // subscript mutable sequence105: #if _HAS_ITERATOR_DEBUGGING106: if (_Size <= _Pos)107: _DEBUG_ERROR("array subscript out of range");108: #endif /* _HAS_ITERATOR_DEBUGGING */109:110: _SCL_SECURE_VALIDATE_RANGE(_Pos < _Size);111:112: return (_Elems[_Pos]);113: }114:115: const_reference operator[](size_type _Pos) const116: { // subscript nonmutable sequence117: #if _HAS_ITERATOR_DEBUGGING118: if (_Size <= _Pos)119: _DEBUG_ERROR("array subscript out of range");120: #endif /* _HAS_ITERATOR_DEBUGGING */121:122: _SCL_SECURE_VALIDATE_RANGE(_Pos < _Size);123:124: return (_Elems[_Pos]);125: }126:127: reference front()128: { // return first element of mutable sequence129: #if _HAS_ITERATOR_DEBUGGING130: if (_Size == 0)131: _DEBUG_ERROR("array<T, 0>::front() invalid");132: #endif /* _HAS_ITERATOR_DEBUGGING */133:134: _SCL_SECURE_VALIDATE_RANGE(0 < _Size);135:136: return (_Elems[0]);137: }138:139: const_reference front() const140: { // return first element of nonmutable sequence141: #if _HAS_ITERATOR_DEBUGGING142: if (_Size == 0)143: _DEBUG_ERROR("array<T, 0>::front() invalid");144: #endif /* _HAS_ITERATOR_DEBUGGING */145:146: _SCL_SECURE_VALIDATE_RANGE(0 < _Size);147:148: return (_Elems[0]);149: }150:151: reference back()152: { // return last element of mutable sequence153: #if _HAS_ITERATOR_DEBUGGING154: if (_Size == 0)155: _DEBUG_ERROR("array<T, 0>::back() invalid");156: #endif /* _HAS_ITERATOR_DEBUGGING */157:158: _SCL_SECURE_VALIDATE_RANGE(0 < _Size);159:160: return (_Elems[_Size - 1]);161: }162:163: const_reference back() const164: { // return last element of nonmutable sequence165: #if _HAS_ITERATOR_DEBUGGING166: if (_Size == 0)167: _DEBUG_ERROR("array<T, 0>::back() invalid");168: #endif /* _HAS_ITERATOR_DEBUGGING */169:170: _SCL_SECURE_VALIDATE_RANGE(0 < _Size);171:172: return (_Elems[_Size - 1]);173: }174:175: _Ty *data()176: { // return pointer to mutable data array177: return (_Elems);178: }179:180: const _Ty *data() const181: { // return pointer to nonmutable data array182: return (_Elems);183: }184:185: _Ty _Elems[_Size == 0 ? 1 : _Size];186: };. 실제 구현 코드이며 소스 젤 아래 부분을 보시면 _Ty 에 대해 _Size 만큼 배열을 잡는걸 볼 수 있습니다. (0 이면 크기를 1로 잡는군요 –_-ㅋ)
. 실제 배열을 가지고 있으며 인터페이스는 size() 와 max_size() 가 동일하게 _Size 를 돌려주는 애매한 상황만 말고는 다들 이름만 보고도 이해가 갈만합니다.
. 요즘 배열보다는 array 를 더 자주 사용하고있습니다. 보기도 좋군요 @_@ㅋ (개인적인 취향입니다)
'coder story > C/C++' 카테고리의 다른 글
| std::tr1::array (0) | 2010/03/19 |
|---|---|
| tbb::concurrent_queue (1) | 2010/03/17 |
| tbb::parallel_for (0) | 2010/03/17 |
| std::tr1 tuple (0) | 2010/03/15 |
| 다운 캐스팅 (0) | 2009/07/15 |
| Visual Studio 예외처리 옵션 (0) | 2009/03/24 |
