동적 메모리 할당을 지원하는 C++의 배열임

<aside> ❗ 동적으로 할당된 메모리는 사용이 끝나면 해제해주어야함 memory leak이 발샐할 수 있기 때문

</aside>

C언어 : malloc() 또는 calloc()함수로 메모리를 할당하고 free()함수로 해제함

C++ : new로 할당하고 delete로 해제함

int* ptr = new int[3];  //ptr을 배열처럼 사용 -> 세 원소 모두 가비지밸류가 들어가있게 됨

int *ptr = new int[3] {}; //이와같이 초기화 해줘야 ptr의 원소가 0으로 초기화됨

delete [] ptr;  //[]대괄호연산자 사용하여 메모리 해제하기

동적메모리할당의 장점 = heap영역에 할당되기 때문에 대용량 배열도 할당 가능

<aside> ❗ int& = 참조형태로 반환하겠다는 의미

</aside>

#include <iostream>

using namespace std;

template <typename T>
class DynamicArray
{
private:
	unsigned int sz;
	T* arr;

public:
	DynamicArray(int n) : sz(n) {
		arr = new T[sz] {};
	}

	~DynamicArray() { 
		delete [] arr;
		cout << "memory deleted!" << endl;
	}

	unsigned int size() { return sz; }

	T& operator[] (const int i) { return arr[i]; }
	const T& operator[] (const int i) const { return arr[i]; }
};

int main()
{
	DynamicArray<int> da(5);
	da[0] = 10;
	da[1] = 20;
	da[2] = 30;

	for (int i = 0; i < da.size(); i++)
		cout << da[i] << endl;
}

template <typename T>를 사용하여 반환형을 자유롭게 사용할 수 있음

DynamicArray을 생성할 때 typename인 <int>를 명시 해주었음.

DynamicArray 클래스 내에서도 인자들의 반환형을 T로 바꿔주었음.


std::vector의 원소로는

Class T;가 있는데 이것은 타입을 지정하는 부분이다.

class Allocator = std::allocator<T>;가 있다. 이 부분은 동적으로 메모리를 할당하는 부분인데

std::allocator는 new와 delete로 할당하는 방식이다.


#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<int> v1;
	vector<int> v2(10); // v2[0] ~ v2[9] 초기값인 0이 들어가게 됨
	vector<int> v3(10, 1);  //초기값을 1로 설정
	vector<int> v4 {10, 20, 30, 40, 50};  //초기값을 10~50으로 설정했음

	vector<int> v5(v4);  //이것도 복사의 한 방법 ->깊은복사가 됨
	vector<int> v7 = v4; //이런식으로 복사해도 깊은복사로 생성됨
	vector<int> v6(v4.begin(), v4.begin() + 3);

	for (int i = 0; i < v6.size(); i++)
		cout << v6[i] << endl;

	vector<vector<int>> mat1(2, vector<int>(3));
	//2차원 벡터의 선언임 2행3열의 int형 vector임 초기값은 0으로 지정
	vector<vector<int>> mat1(2, vector<int>(3, 1));
	//위와같이 선언한다면 초기값은 1로 설정이 됨
	vector<vector<int>> mat2 {
		{1, 2, 3},
		{4, 5, 6}
	};

	for (int r = 0; r < mat2.size(); r++) {
		for (int c = 0; c < mat2[r].size(); c++) {
			cout << mat2[r][c] << ", ";
		}
		cout << endl;
	}
}

스크린샷 2022-06-30 오후 4.46.14.png