DNF LOVE

C++ STL> Vector Container 에 대해 알아보자.(2차원 vector 사용) 본문

Programming/C++

C++ STL> Vector Container 에 대해 알아보자.(2차원 vector 사용)

botho 2019. 10. 23. 17:30
반응형

C++에서 배열과 비슷하게 많이 사용되는 시퀀스 컨테이너가 존재한다. 그것이 바로 [Vector]이다.

vector 컨테이너는 자동으로 메모리가 할당되는 배열이라고 생각하면 편하다. vector는 정말 편한 자료형식이다. 이는 template를 사용하기 때문에 다양한 데이터 타입으로 사용할 수 있다.(심지어 객체도 된다)

vector는 맨 뒷쪽에서 삽입과 삭제가 가능하며 중간에 값을 삽입하거나 삭제가 가능하다. 그러나 배열과 마찬가지로 중간 삽입 삭제는 상대적으로 비효율적이다.


vector를 사용하려면 #include <vector> 를 사용하여 헤더파일을 추가 해야한다.

1. vector 선언

#include <vector>

vector<int> v;
// vector<데이터타입> 변수명;

2. 생성자와 연산자

vector<int> v; // 비어있는 vector 생성
vector<int> v(5); // 0으로 초기화 된 5개의 원소를 가진 벡터 생성
vector<int> v(5, 2); // 2로 초기화된 5개의 원소를 가진 벡터를 생성
vector<int> temp(v); // v의 내용을 복사하여 temp라는 이름을 갖는 벡터 생성

3. 벡터의 다양한 멤버변수

1) v.assign(5, 2); // 2의 값으로 5개의 원소 할당

	vector<int> v;
	v.assign(5, 2);

	for (int i = 0; i < v.size(); i++) {
		cout << v[i];
	}
    
    // 결과 22222

2) v[index]; // index 번째 원소를 리턴한다. 범위를 점검하지는 않지만 속도는 빠르다.

3) v.at(index); // index 번째 원소를 리턴한다. v[index] 보다는 느리지만 범위를 점검한다.

4) v.front(); //첫 번째 원소를 리턴한다

5) v.back(); // 마지막 원소를 리턴한다.

6) v.clear(); // 모든 원소를 제거한다. 그러나 원소만 제거하고 메모리에 vector는 그대로 있다.

7) v.begin(); // 첫 번쨰 원소를 가리킨다(iterator와 사용)

8) v.end(); // 마지막의 다음을 가리킨다(iterator와 사용)

9) v.rbegin(); // reverse begin을 가리킨다. 즉, 거꾸로 해서 첫 번째 원소를 가리킨다(iterator와 사용)

10) v.rend(); // reverse end을 가리킨다. 즉, 거꾸로 해서 마지막의 다음을 가리킨다(iterator와 사용)

11) v.reserve(n); // n개의 원소를 저장할 위치를 예약한다. 즉, 미리 동적할당을 한다.

12) v.size(); // 벡터의 원소 갯수를 리턴한다. 즉, 할당된 메모리 안에 요소가 들어가있는 개수를 리턴한다.

13) v.capacity(); // 할당된 공간의 크기를 리턴한다. size()와는 자주 헷갈리지만 전혀 다른 기능을 갖고 있다. push_back이 일어날때마다 동적할당을 하면 비효율적이기 때문에 미리 정해둔 만큼 동적할당을 한번에 하기때문에 공간 할당의 기준은 점점 커지면서 capacity를 할당하게 된다.

14) v.swap(v2); // vector temp와 vector v의 모든 요소를 맞바꾼다. v의 할당된 메모리를 프로그램이 끝나기 전에 없애고 싶을 때, 즉 capacity를 없앨 때 사용한다. temp를 capacity가 0인 임시 객체로 만들어서 스왑한다.

15) v.empty(); // vector가 비어있으면 true이다. 비어있다의 기준은 size() 요소이다.

16) v.resize(n); // 크기를 n으로 변경한다. 더 커졌을 경우 default값인 0으로 초기화한다

17) v.resize(n, k); // 크기를 n으로 변경한다. 더 커졌을 경우 인자의 값을 k로 초기화한다.


4. 벡터의 삽입 

1) v.push_back(1); // 마지막 원소 뒤에 원소 1을 삽입한다.

2) v.insert(2, 3, 4); // 2번째 위치에서 3개의 4값을 삽입하여 2번째 원소부터 뒤로 밀리게 된다.

3) v.insert(2, 3); // 2번째 위치에서 3의 값을 삽입하고 삽입한 곳의 iterator를 반환한다.

 

5. 벡터의 삭제

1) v.pop_back(); // 마지막 원소를 제거한다.

2) v.erase(iter); // iter가 가리키는 원소를 제거한다. size만 줄어들고 capacity(할당된 메모리)는 그대로 남는다.

 


6. 2차원 벡터

// 2차원 배열 선언
	vector<vector<int>> v;
	// v2[6][5] 배열 선언, 0으로 초기화
	vector<vector<int>> v2(5, vector<int>(5));

	//값 삽입

	int serial = 0;

	for (int i = 0; i < 6; i++) {
		for (int j = 0; j < 5; j++) {
			v2[i][j] = serial++;
		}
	}

	//값 출력

	for (vector<int> vec : v2) {
		for (int n : vec)
			printf("%3d ", n);
		cout << endl;
	}
반응형