vector

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

public void iterator()
{
	// <algorithm> 함수 사용시 대부분 input으로 반복자를 사용하기 때문에 정리함
	// iterator 변수 선언 시 자료형을 'auto'로 선언하면 편하다.
	vector<int> b(5);
	vector<int>::iterator bb = b.begin() + 2; 
	// => auto bb = b.begin() + 2;
	printf("%d", *bb) // 벡터 b의 3번째 원소, 1번째 원소면 위 코드에서 + 2를 지우면 됨

	for (vector<int>::iterator bbb = b.begin(); bbb != b.end(); bbb++)
	// => for (auto bbb = b.begin(); ... )
	{
		printf("%d", *bbb);
		// 벡터 b의 모든 원소 접근
	}

	for (vector<int>::reverse_iterator bbb = b.rbegin(); bbb != b.rend(); bbb++)
	// => for (auto bbb = b.rbegin(); ... )
	{
		printf("%d", *bbb);
		// 벡터 b의 모든 원소 역순으로 접근
	}
}

public void intialize() 
{
	vector<자료형> 변수; // 빈 벡터 생성
	vector<자료형> 변수(사이즈); 
	/*
	 * 사이즈만큼 디폴트 값으로 채워진 벡터 생성
	 * ex) vector<int> a(3) => { 0, 0, 0 }
	 */
	vector<자료형> 변수(사이즈, 디폴트 값);
	/*
	 * ex) vector<char> a(3, 'a') => { 'a', 'a', 'a' }
	 * ex) int n = 3; vector<int> a(n, 5) => { 5, 5, 5 }
	 */
	vector<자료형> 변수 = { 데이터 배열 };
	vector<자료형> 변수(다른 vector변수);
	/*
	 * vector<char> a = { 'a', 'b' };
	 * vector<char> b(a);
	 */
	vector<자료형> 변수(자료형 배열, 자료형 배열 + 복사할 사이즈);
	/*
	 * int arr[] = { 1, 2, 3, 4, 5 };
	 * vector<int> a(arr, arr + 4); => a = { 1, 2, 3, 4 }가 됨
	 */ 
	vector<자료형> 변수 = (다른 vector변수.begin(), 다른 vector변수.end());
	/*
	 * vector<int> a = { 1, 2, 3 };
	 * vector<int> b(a.begin(), a.end());
	 */

	// vector, deque만 가능(∵직접접근)
	vector<자료형> 변수 = 
		(다른 vector변수.begin(), 다른 vector변수.begin() + 복사할 사이즈);
	/*
	 * vector<int> a = { 1, 2, 3 };
	 * vector<int> b(a.begin(), a.begin() + 1);
	 */
}

public void copy()
{
	vector<string> a = { "ab", "bc" };
	vector<string> c;
	c = a; // { "ab", "bc" }가 복사돼서 들어간다.
	// a.push_back()을 해도 c는 영향받지 않는다.
}

public void insert()
{
	vector<int> a;
	a.push_back(데이터); // 맨 뒤에 데이터 추가
}

public void erase()
{
	vector<int> a;
	a.pop_back(); // 맨 뒤의 데이터 삭제
	a.clear() // 모든 원소 삭제
}

public void size()
{
	vector<char> a;
	a.size();
	a.empty(); // a가 비었는지 여부 리턴
}

public void search()
{
	vector<int> a = { 1, 2, 3, 4 };
	a.front(); // 1
	a.back();  // 4
	/* 
	 * 나머지 중간 원소는 
	 * 1. [1], [2] 인덱스로 직접 접근 
	 * 2. 반복문+iterator를 통해 선형탐색
	 */
	a[2] // 3
}

public void contains()
{
	// 연관 컨테이너처럼 find함수가 내장돼있지 않아서 
	// #include <algorithm> 의 find함수를 써야함
	vector<int> a = { 1, 2, 3, 4, 5 };
	auto i = find(a.begin(), a.end(), 2); // 결과값은 iterator로 받을 수 있음
	if (i != a.end())
	{
		// 원소를 포함하고 있음
		int index = i - a.begin() // 찾는 원소의 인덱스
	}
}

public void swap()
{
	vector<int> a = { 1 };
	vector<int> b = { 2 };
	a.swap(b); // a는 { 2 }, b는 { 1 }을 갖게 된다. 
}

list

                                                    (그림) 양방향 연결리스트

                                                (그림) 양방향 연결리스트
#include <list>
using namespace std;

public void iterator()
{
	list<int> b(5);
	list<int>::iterator bb = b.begin(); 
	// vector와 달리 b.begin() + 2 이렇게 특정 인덱스 할당할 수 없다! (∵직접 접근 불가)
	// 무조건 b.begin() or b.end()만 가능함
	printf("%d", *bb) // 리스트 b의 1번째 원소
	// 나머지는 vector와 동일
}

public void initialize()
{
	// vector와 동일 (vector와 달리 iterator로 특정 인덱스 접근 불가한 것만 주의)
}

public void copy()
{
	// vector와 동일
}

public void insert()
{
	list<int> a = { 5, 6 };
	a.push_front(값);
	a.push_back(값);
	a.insert(iterator, 값); // iterator가 가리키는 곳 앞에 값 삽입
	/*
	 * list<int>::iterator aa = a.end();
	 * a.insert(aa, 7); => a는 { 5, 6, 7 }이 된다.
	 */
}

public void erase()
{
	list<int> a = { 5, 6, 7 };
	a.pop_front();
	a.pop_back();
	a.erase(iterator); // iterator가 가리키는 곳 원소 삭제
	/*
	 * list<int>::iterator aa = a.begin();
	 * a.erase(aa); => a는 { 6, 7 }이 된다.
	 * 중간 원소 삭제를 원할 경우 iterator로 반복문을 돌아서 삭제해야함
	 */
	a.clear();
}

public void size()
{
	// vector와 동일
}

public void search()
{
	// vector와 동일 (단, 중간원소를 인덱스를 통해 직접접근하는 방식은 불가) 
}

public void contains()
{
	// vector와 동일
}

public void swap()
{
	// vector와 동일
}

deque

양방향으로 삽입, 삭제가 가능한 큐 ⇒ 데큐(혹은 덱)

양방향으로 삽입, 삭제가 가능한 큐 ⇒ 데큐(혹은 덱)

#include <deque>
using namespace std;

public void iterator()
{
	// vector와 동일
}

public void initialize()
{
	// vector와 동일
}

public void copy()
{
	// vector와 동일
}

public void insert()
{
	deque<int> a = { 5, 6 };
	a.push_front(값); // { 값, 5, 6 }
	a.push_back(값);  // { 5, 6, 값 }
}

public void erase()
{
	deque<int> a = { 5, 6, 7 };
	a.pop_front(); // { 6, 7 }
	a.pop_back();  // { 5, 6 }
	a.clear();
}

public void size()
{
	// vector와 동일
}

public void search()
{
	// vector와 동일
}

public void contains()
{
	// vector와 동일
}

public void swap()
{
	// vector와 동일
}