삽질의 현장/- C++

#019_시(c)시(c)해서 C++?!_STL_vector 기능 구현 코드

shovelman 2015. 7. 16. 01:16


안녕하세요 삽잡이 입니다...


이번시간에는 vector의 동작원리를 이해할 수 있도록 

기본적인... 낮은... 수준을 가진 저의 기준으로

vector의 기능들을 구현해본 코드를 소개하려고 합니다...


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
 
#pragma once
template <typename Element>
class vector
{
    Element* base; // 저장소
    int ncapa; // 저장소 크기
    int ncnt; // 보관 개수
public:
    class iterator
    {
        Element *pos;
    public:
        iterator(Element *pos = 0// 기본 생성
        {
            this->pos = pos;
        }
        int operator - (Element *pos) // Element 요소가 왔을 때 연산자 중복 정의
        {
            return this->pos - pos; // 요소의 개수 파악
        }
        bool operator!=(const iterator &iter)
        {
            return pos != iter.pos;
        }
        bool operator==(const iterator &iter)
        {
            return pos == iter.pos;
        }
        iterator &operator++() // 전위 증가 연산자
        {
            pos++;//다음 위치로 이동
            return (*this);
        }
        const iterator operator++(int// 후위 증가 연산자
        {
            iterator re(*this);
            pos++// 다음 위치로 이동
            return re;
        }
        Element operator *() // 간접 연산자
        {
            return (*pos); // 해당 주소의 요소값 참조
        }
    };
    int capacity() const // 저장소의 크기
    {
        return ncapa;
    }
    int size()const // 보관 개수
    {
        ncnt;
    }
    // 생성자
    vector()
    {
        base = 0;
        ncapa = 0;
        ncnt = 0;
    }
    //순차보관 -> 맨뒤에 보관
    void push_back(Element data)
    {
        //특정 위치에 보관 insert
        insert(end(), data);
    }
    //iter  위치에 보관
    void insert(iterator iter, Element data)
    {
        if(ncapa == ncnt) //꽉 차면
        {
            // 연산자 중복 정의 필요
            int index = iter - base;
            // 공간 재할당
            if(ncapa = 0// 현재 저장소의 크기가 0이면
            {
                reserve(1);//저장소의 크기를 갱신 (저장소의 크기만 입력인자 길이만큼 늘려준다...)
            }
            else
            {
                reserve(ncapa*2); //저장소의 크기를 갱신 
            }
        }
        shiftright(index); // index뒤의 요소를 한 칸씩 오른쪽으로 이동
        base[index] = data;
        ncnt++;
    }
    //iter  위치에 보관한 요소 지움
    void erase(iterator iter)
    {
        int index = iter - base; // base로부터 상대적 거리
        ncnt--;
        shiftleft(index); // index 뒤의 요소를 왼쪽으로 이동
    }
    //저장소 (데이터 보관 되있는 시작 위치)시작 위치 반환
    iterator begin()
    {
        iterator iter(base);
        return iter;
    }
    //가장 최근에 보관한 자료가 있는 다음 위치 반환
    //이번에 보관할 위치 반환
    iterator end()
    {
        iterator iter(base+ncnt);
        return iter;
    }
    //index 위치에 보관한 요소 자체를 반환
    Element &operator[](int index)
    {
        if((index>=0)&&(index<ncapa))
        {
            return base[index];
        }
        throw "돌";
    }
    //보관한 요소 개수를 n개로 갱신
    //만약 현재 보관한 요소가 n보다 작으면 data로 채움
    void resize(int n, Element data)
    {
        if(n > ncapa)
        {
            reserve(n);
        }
        for (int i = ncnt; i<n;i++)
        {
            base[i] = data;
        }
    }
private:
    void shiftright(int index)
    {
        forint n = ncnt; n>index; n--)
        {
            base[n] = base[n-1];
        }
    }
    void reserve(int new_capa)
    {
        Element *temp = base;
        base = new Element[new_capa];
        for(int i = 0; i<ncnt; i++)
        {
            base[i] = temp[i];
        }
        if(temp)
        {
            delete[] temp;
        }
        // 저장소의 용량 변경한 값으로 교체
        ncapa = new_capa;
    }
    void shiftleft(int index)
    {
        for( ; index<ncnt; index++)
        {
            base[index] = base[index+1];
        }
    }
};
 
cs



물론... 백날 이렇게 짜봤자...

우리는 vector를 구현해서 사용할 일이 없겠죠... 이미 잘 구현된 STL에 있으니 ㅎㅎ

하지만 이를 통해 vector 안 요소들의 기능들에 대한

이해를 할 수 있을 것 같습니다...


재미있군요....

오늘은 여기까지~!


이상 삽잡이였습니다!