- STL에 있는 Vector가 어떻게 돌아가는지를
코드를 짜 보았다.
- 실제로 사용할때는 STL을 가져와서 사용할 것이기 때문에 실제로 이번에
짠 걸 또 짜지는 않는다
- 가져다 쓸 뿐이다.
yaVector.h
#pragma once
//yaVector을 써야 하는 이유 : 동적배열
namespace ya
{
int arr[32] = {};
template <typename T> // T = type을 의미
class vector
{
public:
//ctrl + m + o 함수 모두 접기
//ctrl + m + n 함수 하나만 접고 펴기
vector(size_t cap = DEFAULT_CAP) //최솟값으로 메모리를 할당할거야
: mArr(new T[cap]) // 배열 할당
, mSize(0) // 0
, mCapacity(cap) //그래서 capacity에는 cap을 넣어줌
{
}
vector(vector& other) // 복사생성자
: mArr(new T[other.mCapacity])
, mSize(other.mSize)
, mCapacity(other.mCapacity)
{
for (size_t i = 0; i < other.mSize; i++)
{
mArr[i] = other.mArr[i];
}
}
~vector()
{
delete[] mArr;
}
vector& operator=(vector& other) // vector가 vector를 받을 수 있게 할려고
{
if (this != nullptr) // 처음에 null 일수도 있음
{
if (mCapacity < other.mCapacity) // 작으면 내꺼의 값을 늘려주고 넘겨줘야함
{
delete[] mArr; // 지워준다
mArr = nullptr; // 초기화
mCapacity = other.mCapacity; //그리고 넣어준다
mArr = new T[mCapacity];
}
for (size_t i = 0; i < other.mSize; i++)
{
mArr[i] = other.mArr[i]; // 내꺼에 other을 넣어줌
}
mSize = other.mSize;
}
return *this; // 그러면 그냥 반환
}
//vector[0];
T& operator[](size_t idx) { return mArr[idx]; } //?
void push_back(const T& data) //참조를 사용해서 데이터 커지는 것을 막아줌
{
if (mSize >= mCapacity) //capacity 보다 size가 크거나 같을 때
{
if (mCapacity < DEFAULT_CAP) // default 값 안에 있을땐 ㄱㅊ
{
mCapacity = DEFAULT_CAP;
}
else // capacity를 늘려줘야함
{
//int mul = mcapacity * 2;
//mul -= (mcapacity / 2);
mCapacity *= 2; // capacity를 2배 늘려줌
}
T* newArr = new T[mCapacity]; // 늘려준만큼 할당
for (size_t i = 0; i < mSize; i++) // capacity만큼이 아닌 size만큼만 할당
{
newArr[i] = mArr[i];
}
delete[] mArr; // 옮겨줬으니까 기존 껄 삭제해줌
mArr = nullptr;
mArr = newArr; // 새로 옮긴거에 보관
}
//
mArr[mSize] = data;
mSize++;
}
// 보통 capacity가 size보다 작은데 size가 capacity보다 커질 때
// capacity를 늘려줘야 하므로 push_back은 이런 역할을 함
void pop_back()
{
mSize = mSize > 0 ? mSize - 1 : 0; // 사이즈만 줄이면 되는데 배열이 0 일때는 줄여주면 안됨
//3항 연산자
//mSize가 0 보다 크면 mSize -1 출력
//위 조건이 거짓이면 0을 출력
}
//pop_back은 마지막에 넣은 값을 제거
public:
size_t size() { return mSize; } // vector의 원소 갯수
size_t capacity() { return mCapacity; } //vector의 물리적 크기
bool empty()
{
if (mSize == 0)
return true;
return false;
}
void clear() { mSize = 0; } // 사이즈가 0이 되면 어차피 배열은 못 쓴다는 의미
private:
static constexpr size_t DEFAULT_CAP = 32; // 이걸 쓰는 이유가 쓰는 메모리를 아끼기 위해서
T* mArr;
size_t mSize; // 사이즈만큼만 사용할 수 있게 하겠다
size_t mCapacity; // 메모리를 더 추가로 할당하겠다
};
//Vector::DEAFUALT_CAP
}
'STL > vector' 카테고리의 다른 글
main.cpp (0) | 2022.09.28 |
---|---|
VECTOR (0) | 2022.09.28 |
STL (Standard Template Library) (0) | 2022.09.23 |