SKYLIGHT STUDIO

[C++ 리바이브] C++ 동적 배열 본문

Computer Programming/Coding Test(C++)

[C++ 리바이브] C++ 동적 배열

SKY_L 2024. 10. 2. 20:57

패배하고 복종하지 않는 것은 승리이다. 승리에 안주하는 것은 패배이다. - 유제프 피우수트스키

 

다 알고 있겠지만 C++는 일반적인 방법으로 동적 배열을 사용할 수 없다. 유니티가 쓰기 쉬운 이유 중 하나.

C++에서는 std::vector을 사용해야 하며, 이 배열을 사용해야 비로소 크기를 동적으로 줄이거나 늘릴 수 있다.

 

일반적인 포인터를 이용한 동적 배열과는 조금 결이 다르며, 일단 이 특징부터 살펴볼 것이다.

 

#include <vector>
using namespace std;

vector<int> v;
v.push_back(10); // 벡터에 10을 추가
v.push_back(20);

 

일반적으로 이렇게 사용한다.

 


 

1. 템플릿 클래스

vector<int> v1;       // 정수형 벡터
vector<string> v2;    // 문자열형 벡터
vector<float> v3;     // 실수형 벡터

 

어떤 자료형이든 사용할 수 있는 템플릿 클래스.

 

2. 자동 메모리 관리

정확히는 스코프(scope)가 끝나면 알아서 메모리에서 해제된다. 포인터 배열처럼 따로 delete[]를 해줄 이유가 없는 것.

 


3. 메소드

일단 배열처럼 작동하긴(랜덤 액세스로 인덱스를 통한 접근도 똑같이 가능. 시간 복잡도도 O(1)) 하지만, 일반적으로 사용할 수 있는 메소드들도 존재한다.

 


 

push_back()

v.push_back(10); // 벡터에 10을 추가
v.push_back(20); // 벡터에 20을 추가

 

벡터에 요소를 추가할 때 사용하는 메소드. 뭔가 자료구조 하면서 기시감을 느낀 사람이 많을 지도.

 


pop_back()

v.pop_back(); // 벡터의 마지막 요소 삭제

 

벡터의 마지막 요소를 제거한다.

 


 

벡터 초기화

 

vector<int> v(5, 0); // 5개의 0으로 초기화된 벡터 생성

 

이건 메소드가 아니긴 하지만...

벡터를 선언할 때 특정 크기와 초기값으로 초기화할 수 있다는 것.

 


 

반복자(iterator)

 

for (auto it = v.begin(); it != v.end(); ++it) {
    cout << *it << " "; // 각 요소 출력
}

 

전통적인 for문을 사용하려면 배열의 크기를 확인해야 하는 이슈가 생기기에 이런 식으로도 처리하는 것.

v.begin은 벡터의 시작, v.end는 벡터의 끝이며, 이를 이용해 전체를 순회할 수 있다.

 


 

정렬

sort(v.begin(), v.end()); // 벡터의 모든 요소를 오름차순으로 정렬

 

오름차순으로 정렬해주는 메소.

 


 

예약

 

일단 이 메소드를 다루기 전에 내부적인 특징을 더 하나 짚어야 한다.


처음에 벡터는 기본 크기의 메모리를 할당받는다. 요소를 추가하다가 할당된 메모리가 가득 차면, 더 큰 메모리 블록을 할당하고 기존 데이터를 복사한 후, 원래의 메모리는 해제하는 식으로 굴러간다.

 

당연히 이러면 퍼포먼스가 낮아지이게 일단 크게 부르는 식으로 메모리를 '예약'할 수 있는 것.

 

v.reserve(1000); // 1000개의 요소를 미리 저장할 수 있도록 메모리 예약

 

size()

 

vector<int> v = {10, 20};
cout << v.size(); // 출력: 2

 

'Computer Programming > Coding Test(C++)' 카테고리의 다른 글

[C++/1076] 저항  (0) 2024.10.08
[C++][2547] 사탕 선생 고창영  (1) 2024.10.02
[C++][1267] 핸드폰 요금  (0) 2024.10.01
[C++][1264] 모음의 개수  (0) 2024.09.29
[C++ 리바이브] Stream, Cout, Cin  (0) 2024.09.26