CPP – STL 자료구조 모음

STL: standard template library의 약자로서 많은 프로그래머들이 공통적으로 사용하는 자료구조와 알고리즘을 구현한 클래스들로 이루어져 있다. STL은 템플릿 기법을 사용하였기 때문에 어떤 자료형에 대해서도 사용할 수 있다.

템플릿: 다양한 자료형을 사용할 수 있도록 클래스를 설계하는 기법
(템플릿으로 작성된 클래스를 사용할 때는 원하는 자료형을 지정한다.)

ex) vector<배열의 자료형> 배열의 이름(배열의 크기);

1. 벡터 (Vector)

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

class Person {
public:
	Person(string n, int a) :name(n), age(a) {}
	string get_name() const { return name; }
	int get_age() const { return age; }
	void print() {
		cout << name << " " << age << endl;
	}

public:
	string name;
	int age;
};

// 특정 멤버를 기준으로 오름차순
bool compare(Person& p, Person& q) {
	return p.get_age() < q.get_age();
}

int main() {
	// 벡터 및 반복자 생성 
	vector<Person> v;
	vector<Person>::iterator it;

	// 벡터의 뒷 부분에서 추가 
	v.push_back(Person("Kim", 30));
	v.push_back(Person("Park", 22));
	v.push_back(Person("Lee", 26));
	v.push_back(Person("Ahn", 23));
	v.push_back(Person("Hyun", 19));
	v.push_back(Person("Park", 22));

	// 벡터의 특정 영역에 추가
	// v.begin() -> 벡터의 시작 주소(첫 원소 주소)
	// v.end() -> 벡터의 끝 주소(마지막 원소에서 한 칸 더 간 주소)
	v.insert(v.begin(), Person("Kim2", 31));
	v.insert(v.begin() + 1, Person("Kim3", 32));
	v.insert(v.begin() + 2, Person("Kim4", 32));

	// 벡터의 특정 영역 제거
	v.erase(v.begin());
	v.erase(v.begin(), v.begin() + 2); // begin~begin+1

	// 벡터의 뒷 부분에서 제거
	v.pop_back();
	v.pop_back();

	// 안정정렬 
	sort(v.begin(), v.end(), compare);

	// 벡터 원소 출력 (반복자 사용)
	for (it = v.begin(); it != v.end(); it++)
		it->print();
	cout << endl;

	// 벡터 원소 출력 (범위 기반 for문)
	for (auto& e : v)
		e.print();

	// 벡터의 모든 요소 삭제
	if (!v.empty()) {
		cout <<"벡터 원소"<< v.size() <<"개 삭제"<<endl;
		v.clear();
	}

	return 0;
}


2. 스택 (Stack)

#include <iostream>
#include <stack>

using namespace std;

int main() {
	stack<int> st;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	// 삽입
	for(auto& a : arr)
		st.push(a);

	// 삭제
	while (!st.empty()) {
		cout << st.top() <<", size="<<st.size()<< endl;
		st.pop();
	}

	return 0;
}


3. 큐 (Queue)

#include <iostream>
#include <queue>

using namespace std;

int main() {
	queue<int> q;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	// 삽입
	for(auto& a : arr)
		q.push(a);

	// 삭제
	while (!q.empty()) {
		cout << q.front() <<", size="<< q.size()<< endl;
		q.pop();
	}

	return 0;
}


4-1. 우선순위 큐 (Max Heap)

#include <iostream>
#include <queue>

using namespace std;

int main() {
	priority_queue<int> pq;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	// 삽입
	for(auto& a : arr)
		pq.push(a);

	// 삭제
	while (!pq.empty()) {
		cout << pq.top() <<", size="<< pq.size()<< endl;
		pq.pop();
	}

	return 0;
}


4-2. 우선순위 큐 (Min Heap)

#include <iostream>
#include <queue>

using namespace std;

int main() {
	priority_queue<int, vector<int>,greater<int>> pq;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	// 삽입
	for(auto& a : arr)
		pq.push(a);

	// 삭제
	while (!pq.empty()) {
		cout << pq.top() <<", size="<< pq.size()<< endl;
		pq.pop();
	}

	return 0;
}


5. 덱 (Deque)

#include <iostream>
#include <deque>

using namespace std;

int main() {
	deque<int> dq;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	// 삽입
	for (auto& a : arr) {
		if (a <= 5)
			dq.push_back(a); // 1 2 3 4 5 <- 후단 삽입
		else
			dq.push_front(a); // 전단 삽입 -> 10 9 8 7 6
	}
	// 10 9 8 7 6 1 2 3 4 5

	// 후단 삭제
	while (dq.size()>5) {
		cout << dq.back() <<", size="<< dq.size()<< endl;
		dq.pop_back();
	}

	// 전단 삭제
	while (!dq.empty()) {
		cout << dq.front() << ", size=" << dq.size() << endl;
		dq.pop_front();
	}

	return 0;
}


6. 집합 (Set)

#include <iostream>
#include <set>

using namespace std;

int main() {
	set<int> s;

	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.erase(2);

	// 집합 원소 못 찾으면 end() 반환
	auto pos = s.find(2);
	if (pos != s.end())
		cout << "find" << endl;
	else
		cout << "not find" << endl;

	return 0;
}


7. 맵 (Map)

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main() {
	map<string, string> m;
	
	// 삽입
	m["Ahn"] = "010-1234-5678";
	m["Park"] = "010-2345-6789";
	m["Ho"] = "010-3456-7890";
	m.insert({"Kim","010-1212-3434"});

	// 삭제 
	m.erase("Kim");

	// 검색
	if (m.find("Ho") == m.end())
		cout << "not find" << endl;

	// 출력
	for (auto& e : m)
		cout << e.first << ":" << e.second << endl;

	return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *