본문 바로가기

개발/C++

C++ 벡터 구현해보기

STL 벡터 그냥 사용법은 패스..



특징으로는


동적 배열


내부는 배열로 구성됨


임의 요소 접근이 가능함


Capacity가 가득 찼을 때 배열 길이를 늘여 메모리를 새로 할당 하고 기존 배열에서 요소를 옮겨야 해 느림 new(시스템콜) 커널에 요청


마지막 인덱스가 아닌 요소를 삭제할 때 뒤의 요소를 옮겨야 해 느림, 할당된 메모리에 비해 적게 사용할 가능성이 있음


Capacity : 내부 배열의 길이


Size : 추가된 요소 개수



구현 코드


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
#pragma once
 
template<typename T>
class MyVector {
private:
    size_t size;
    size_t capacity;
    T* list;
public:
    MyVector();
    MyVector(const int n);
    ~MyVector();
    T& operator[](size_t index);
    T& at(size_t index);
    T& Front();
    T& Back();
    void Push_Back(const T& value);
    void Pop_Back();
    void Clear();
    size_t Size();
    size_t Capacity();
};
template <typename T>
MyVector<T>::MyVector() :size(0), capacity(0) {
    list = new T[capacity];
}
template <typename T>
MyVector<T>::MyVector(const int n) : size(n), capacity(n) {
    list = new T[capacity];
}
template <typename T>
MyVector<T>::~MyVector() {
    delete[] list;
}
template <typename T>
T& MyVector<T>::operator[](size_t index) {
    /*if (index >= size) {
    throw new std::out_of_range("out_of_range");
    }*/
    return list[index];
}
template <typename T>
T& MyVector<T>::at(size_t index) {
    /*if (index >= size) {
    throw new std::out_of_range("out_of_range");
    }*/
    return list[index];
}
template <typename T>
T& MyVector<T>::Front() {
    return list[0];
}
template <typename T>
T& MyVector<T>::Back() {
    return list[size - 1];
}
template <typename T>
void MyVector<T>::Push_Back(const T& value) {
    if (capacity <= size) {
        capacity = size + 1;
        T* temp_list = new T[capacity];
        for (size_t i = 0; i < size; i++)
        {
            temp_list[i] = list[i];
        }
        //memcpy(temp_list, list, sizeof(T) * size);
        delete[] list;
        list = temp_list;
    }
    list[size++= value;
}
template <typename T>
void MyVector<T>::Pop_Back() {
    list[--size= nullptr;
}
template <typename T>
void MyVector<T>::Clear() {
    for (int i = 0; i < size; i++) {
        list[i] = nullptr;
    }
    size = 0;
}
template <typename T>
size_t MyVector<T>::Size() {
    return size;
}
template <typename T>
size_t MyVector<T>::Capacity() {
    return capacity;
}
cs


'개발 > C++' 카테고리의 다른 글

C++ HashMap 구현해보기 (unorder_map)  (0) 2019.03.03
C++ 맵 구현해보기  (0) 2019.02.23
C++ 리스트 구현해보기  (0) 2019.01.26
C++ 메모리 구조  (0) 2019.01.06
GoogleTest for C++ 사용하기  (0) 2019.01.05