[C++STL] 시퀀스 컨테이너 - vector

박남호·2022년 12월 6일
0

vector는 제일 널리 알려진 기능이라 기본적인 push_back, pop_back과 같은 기능은 생략하고 내가 잘 몰랐던 기능이나 개념에 대해 포스팅 하고자 한다.
먼저 capacity()는 할당된 메모리의 크기를 반환한다. vector는 push_back을 할때마다 메모리를 재할당과 이전 원소 복사 문제가 있는데 미리 대략적인 크기를 알고있다면 reserve로 미리 메모리 공간(capacity)을 예약해서 이러한 문제를 피할수 있다. reserve로 예약한 크기를 넘어서 삽입하면 (이전 capacity + 이전 capacity/2)로 재할당된다.
아래는 vector를 사용하는 다양한 방법에 대한 예제이다.

vector< int > v1(5); //0으로 초기화된 size가 5인 컨테이너
vector< int > v1(7,0); //0으로 초기화된 size가 7인 컨테이너
vector< int > v1(7,10); //10으로 초기화된 size가 7인 컨테이너
v1.swap(v2); //v1과 v2를 swap한다.
v1.front(); v1.back(); // v1의 맨 처음과 맨 마지막 원소 참조
v1.front() = 100; v1.back() = 500; //v1의 맨 처음과 맨 마지막 원소 변경
v1[4], v1.at(4) //[ ]나 at은 기능이나 결과는 같지만 [ ]는 범위 점검 없이 동작하며 at은 범위 점검을 한다. 즉, 범위를 벗어나는 참조를 했을때 out_of_range를 반환한다.

반복자 iterator : 컨테이너는 모든 원소의 시작과 끝을 가리키는 반복자 쌍을 begin()과 end() 멤버 함수로 제공한다. 아래예제는 begin()과 end() 멤버 함수를 사용한 가장 간단한 예제로 반복자를 사용하여 원소를 출력한다.

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

int main()
{	
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter) 
	{
		cout << *iter << endl;
	}
	return 0;
}

vector< int >::iterator : 반복자 클래스이다, vector 내에 정의되어있다.
vector< int >::iterator iter : iter라는 반복자 객체를 생성한다.
v.begin() : v의 첫 번째 원소를 가리키는 반복자를 반환한다.
v.end() : v의 끝을 표식하는 반복자를 반환한다. 끝이 마지막 원소를 가리키는 것이 아닌점을 주의해야한다.

vector는 역방향 반복자도 제공한다 아래는 reverse_iterator에 대한 예제이다.

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

int main()
{	
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter) 
	{
		cout << *iter << ",";
	}
	cout << endl;
	for (vector<int>::reverse_iterator iter = v.rbegin(); iter != v.rend(); ++iter)
	{
		cout << *iter << ",";
	}
	return 0;
}

여기서는 v.rbegin은 역방향 반복자의 첫 원소(정방향 반복자의 끝)를 가리키는 반복자이고 v.rend는 역방향 반복자의 마지막 원소(정방향 반복자의 첫 원소)를 가리키는 반복자이다.

insert() 멤버 함수를 사용하면 반복자가 가리키는 위치에 원소를 추가할 수 있으며 erase() 멤버 함수는 반복자가 가리키는 위치의 원소를 제거할 수 있다. 아래는 insert와 erase 함수의 예제이다.`

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

int main()
{	
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	vector<int>::iterator tIter = v.begin() + 2;
	vector<int>::iterator tIter2;
	tIter2 = v.insert(tIter, 30);
	v.insert(tIter2, 3, 100);
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
	{
		cout << *iter << ",";
	}
	cout << endl;
	tIter = v.begin() + 6;
	tIter2 = v.erase(tIter);
	cout << *tIter2 ;
	cout << endl;
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
	{
		cout << *iter << ",";
	}
	return 0;
}

tIter = v.begin() + 2 : tIter는 100 원소를 가라키는 반복자이다.
tIter2 = v.insert(tIter, 100) : tIter가 가리키는 위치에 100을 삽입하고 삽입한 100의 위치를 가리키는 반복자를 반환하여 tIter2에 대입한다.
v.insert(tIter2, 3, 100) : tIter2가 가리키는 위치에 정수 100을 3개 삽입한다.
tIter2 = v.erase(tIter) : tIter가 가리키는 위치의 원소를 제거. tIter2는 다음 원소 40.

verctor< int > v2(v.begin(), v.end()); //순차열로 v2를 초기화
vector< int > v3;
v3.assing(v.begin(), v.end()); // v3에 순차열을 할당

profile
NamoPark

0개의 댓글