본문으로 바로가기

[Ex준비] C++ Vector.h

category Algorithm/Data Structure 2018. 11. 9. 18:04

안녕하세요, 즈런이에요~ 



오랜만에 글을 올리는데,

요즘 너무 나태해져서...

아무튼 오늘부터 조금씩 손에 코드도 좀 로딩해보려구요.

Expert 준비해보려고 편하게 쓰던 STL 종류들 직접 짜보면서 손에 익히는 중이에요.


계속 못따는건 실력이 없어서겠죠 ㅠ

한 1년 준비하다보면 되지 않을까요?



아래 코드는 아직 검증해본적이 없어요..

그냥 막 짜보는 중입니다.

수정해야할 부분 있으면 말씀해주세요.



(2020.02.03 수정)

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
#ifndef __VECTOR_H__
#define __VECTOR_H__
#include <cstdio>
#include <cstdlib>
using namespace std;
template <class T>
class Vector{
    private:
        int sz,idx;
        T *arr;
 
    private:
        void expand(int size);
 
    public:
        Vector();
        virtual ~Vector();
        void clear();
        void push_back(T x);
        void pop_back() { idx--; }
        void resize(int size);
        int size() const;
        T& operator[](int at) const;
};
 
//public functions
template <class T>
Vector<T>::Vector():sz(1),idx(0) {
    arr = (T*)malloc(sizeof(T));
}
 
template <class T>
Vector<T>::~Vector() {
    if(arr) free(arr);
}
 
template <class T>
void Vector<T>::clear() {
    idx=0;
}
 
template <class T>
void Vector<T>::push_back(T x) {
    if(idx>=sz) {
        sz<<=1;
        expand(sz);
    }
    arr[idx++= x;
}
 
template <class T>
void Vector<T>::resize(int size) {
    if(size<=0) clear();
    else idx = size;
    //if(idx >= (1<<30)) exit(1); //error
    if(idx >= sz) {
        while(idx>=sz) sz<<=1;
        T *tmp = NULL;
        while(true) {
            T *tmp = (T*)realloc(arr, (sz)*sizeof(T));
            if(tmp != NULL) {
                arr = tmp;
                break;
            }
        }
    }
}
 
template <class T>
int Vector<T>::size() const { return idx; }
 
template <class T>
T& Vector<T>::operator[](int at) const {
    return arr[at];
}
 
//private functions
template <class T>
void Vector<T>::expand(int size) {
    while(true) {
        T *tmp = (T*)realloc(arr, (sz)*sizeof(T));
        if(tmp != NULL) {
            arr = tmp;
            break;
        }
    }
}
 
#endif
 
cs