본문 바로가기

C++ 자료구조

[c++] vector

[표준 템플릿 라이브러리(STL)]

c++ 표준 라이브러리에는 다수의 클래스 템플릿과 함수 템플릿이 마련된다.

 

[컨테이너]

컨테이너는 자료를 저장하는 창고와 같은 역할을 하는 구조이다.

즉 배열이나 연결 리스트, 벡터, 집합, 사전, 트리 등이 여기에 해당한다.

 

- 컨테이너의 분류

 

[반복자]

컨테이너의 요소를 가리키는 데 사용된다. 일반화된 포인터 (generalized pointer)

STL 알고리즘은 반복자를 통하여 컨테이너에 접근하여 작업한다.

 

- 반복자의 연산자

  • 컨테이너에서 다음 요소를 가리키기 위한 ++연산자
  • 컨테이너에서 이전 요소를 가리키기 위한 --연산자
  • 두개의 반복자가 같은 요소를 가리키고 있는 지를 확인하기 위한 ==와 != 연산자
  • 반복자가 가리키는 요소의 값을 추출하기 위한 역참조 연산자 *

 

 


 

[vector 클래스]

배열의 단점을 보완한 컨테이너로 실행 시간에 크기를 변경할 수 있는 동적 배열이다.

추가되는 요소의 개수에 따라서 자동적으로 크기가 조절된다.

 

벡터 = 가변길이 배열

 

벡터를 사용하기 위해서는 #include <vector>을 추가해야 한다.

 

 

[백터의 선언과 초기화]

- 벡터 선언

 

- 벡터 초기화

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v1(10); // 10칸을 0으로 초기화
	vector<int> v2(10, 1); // 10칸을 1으로 초기화

	vector<int> v3;
	// v3[1] = 3; 이렇게 접근하고 싶으면 먼저 길이를 만들어야함
}

 

 

[벡터의 동작 원리]

여유분을 두고 메모리를 할당한다. 여유분까지 꽉 찼으면, 기존의 영역을 버리고 기존의 size에서 약 1.5배(visual studio 기준) 사이즈로 새로운 영역을 만든다 (이사를 간다고 생각하면 쉽다)

 

v.capacity() - 여유분을 포함한 총 용량의 개수

v.size() - 실제 사용하고 있는 데이터 개수

* capacity는 늘면 늘지, 줄어들지는 않는다. v.clear()을 해도 줄어들지 않는다!

 

 

[복사 비용을 줄이기]

필요한 사이즈를 대략 알면 reserve() 또는 resize()를 사용하여 capacity를 설정하면 된다.

 

v.resize(n) - 크기를 n개로 변경한다. 커진 경우에는 빈 곳을 0으로 초기화 한다.

v.resize(n, m) - 크기를 n개로 변경한다. 커진 경우에는 빈 곳을 m으로 초기화 한다..

 

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v4;
	v4.reserve(1000);
    // 필요한 사이즈를 대략 알면reserve() 또는 resize()를 사용하여 capacity를 설정해야한다.
    // 현재 v4의 capacity가 1000으로 처음부터 잡힘, 사이즈는 변화하진 않는다.

	for (int i = 0; i < 1000; i++)
	{
		v4.push_back(100);
		cout << v4.size() << " " << v4.capacity() << endl;
	}
}

 

 

[백터 클래스 멤버함수]

push_back(데이터) 벡터 끝 부분에 데이터 추가
pop_back() 벡터 끝 부분에서 데이터를 삭제
front() 벡터 맨 앞에 값 반환
back 벡터 맨 뒤에 값 반환
insert(반복자, 데이터) 반복자 위치 앞에 데이터 삽입
erase(주소)
erase(주소1, 주소2)
주소 위치 데이터만 삭제
주소 1에서 주소 2앞까지 데이터 삭제
empty() 벡터 안에 데이터 존재 안 하면 true리턴
size() 벡터 안 데이터의 개수를 리턴
at(index)
벡터객체이름[index]
벡터의 원소를 참고
clear() 벡터의 원소를 모두 제거

 

[반복자 (iterator)]

벡터와 달리 다른 컨테이너는 v[i]와 같이 인덱스 접근이 안될 수도 있다.

iterator는 모든 컨테이너에 공통적으로 접근할 수 있는 방법이다.

(v.begin()는 반복자만 쓸 수 있음)

begin() 벡터의 첫 iterator(=첫 원소의 주소)를 리턴
end() 벡터의 끝 iterator(=마지막 원소 다음 주소)를 리턴

 

 

*참고 사진

[반복자를 사용하는 다양한 방식]

vector<int>::iterator it = v.begin();

while (it != v.end())
{
	cout << *it;
    cout << " ";
}
cout << endl;

for (auto it = v.begin(); it != v.end(); it++)
{
	cout << *it;
    cout << " ";
}
cout << endl;

for (auto it : v)
{
	cout << it;
    cout << " ";
}
cout << endl;

 

참고만 하기 바람.

 

 

[2차원 벡터]

배열 요소들이 2차원으로 나열된 배열이다.

 

'C++ 자료구조' 카테고리의 다른 글

[c++] 연산자 중복 (오버로딩)  (0) 2024.04.02
[c++] 클래스 (Class)  (0) 2024.04.01
[c++] 배열  (0) 2024.03.25
[c++] 제어 구조와 함수  (0) 2024.03.19
[c++] 문자열(string)  (0) 2024.03.12