본문 바로가기

개발 공부/C++

따라하며 배우는 C++ 16. 표준 템플릿 라이브러리

따라하며 배우는 C++ 16. 표준 템플릿 라이브러리

 

16.1 표준 템플릿 라이브러리와 컨테이너 소개

 

reference가 가장 잘 나와 있는 사이트는 cppreference.com

 

#include <iostream>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <string>
#include <stack>
#include <queue>
using namespace std;

void sequence_containers()
{
	//vector
	{
		vector<int> vec; //#include <vector>
		for (int i = 0; i < 10; ++i)
			vec.push_back(i);

		for (auto& e : vec)
			cout << e << " ";
		cout << endl;
	}

	//deque
	{
		deque <int> deq;
		for (int i = 0; i < 10; ++i)
		{
			deq.push_back(i);
			deq.push_front(i);
		}
		for (auto& e : deq)
			cout << e << " ";
		cout << endl;
	}
	//deque는 push_front도 있다!

}

void associative_containers()
{
	//set
	{
		set<string> str_set;
		str_set.insert("Hello");
		str_set.insert("World");
		str_set.insert("Hello");

		cout << str_set.size() << endl;
		for (auto& e : str_set)
			cout << e << " ";
		cout << endl;
	} //중복 비허용

	//multiset
	{
		std::multiset<string> str_set;
		str_set.insert("Hello");
		str_set.insert("World");
		str_set.insert("Hello");

		cout << str_set.size() << endl;
		for (auto& e : str_set)
			cout << e << " ";
		cout << endl;
	}

	//map : key / value
	{
		std::map<char, int> map;
		map['a'] = 10;
		map['b'] = 20;
		map['c'] = 50;

		cout << map['a'] << endl;
		map['a'] = 100;
		cout << map['a'] << endl;
		for (auto& e : map)
			cout << e.first << " " << e.second << " ";
		cout << endl;
	} //key에 따라 자동 정렬

	//multimap : duplicated keys
	{
		std::multimap<char, int> map;
		map.insert(std::pair<char, int>('a', 10)); //After c++ 14, pair('a', 10);
		map.insert(std::pair<char, int>('b', 10));
		map.insert(std::pair<char, int>('c', 10));
		map.insert(std::pair<char, int>('a', 100));
		cout << map.count('a') << endl;
		for (auto& e : map)
			cout << e.first << " " << e.second << " ";
		cout << endl;
	}
}

void container_adapters()
{
	//stack
	{
		cout << "Stack" << endl;
		std::stack<int> stack;
		stack.push(1);		//push adds a copy
		stack.emplace(2);	//emplace constructs a new object
		stack.emplace(3);
		cout << stack.top() << endl;
		stack.pop();
		cout << stack.top() << endl;
	}

	//queue
	{
		cout << "Queue" << endl;
		std::queue<int> queue;
		queue.push(1);
		queue.push(2);
		queue.push(3);
		cout << queue.front() << " " << queue.back() << endl;
		queue.pop();
		cout << queue.front() << " " << queue.back() << endl;
	}

	//Priority queue
	{
		cout << "Priority queue" << endl;
		std::priority_queue<int> queue;
		for (const int n : {1, 8, 5, 6, 3, 4, 0, 9, 7, 2})
			queue.push(n);
		for (int i = 0; i < 10; ++i)
		{
			cout << queue.top() << endl;
			queue.pop();
		}
	}
}

int main()
{
	sequence_containers();
	associative_containers();
	container_adapters();
	return 0;
}

 

 

16.2 STL 반복자Iterators 소개

 

#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>
using namespace std;

int main()
{
	vector<int> container;
	for (int i = 0; i < 10; ++i)
		container.push_back(i);

	vector<int>::const_iterator itr;
	itr = container.begin();
	while (itr != container.end())
	{
		cout << *itr << " ";
		++itr;
	}
	cout << endl;
	return 0;
}

 

 

for(auto & e : container)

   cout << e << " ";

//이게 많이 쓰인다.

 

for(auto itr = container.begin(); itr!= container.end(); ++itr)

       cout << *itr << " ";

//for문을 사용할 수도 있음.

 

 

#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>
using namespace std;

int main()
{
	list<int> container;
	for (int i = 0; i < 10; ++i)
		container.push_back(i);

	for (auto itr = container.begin(); itr != container.end(); ++itr)
		cout << *itr << " ";
	cout << endl;
	return 0;
}

list 형도 똑같은 iterator 사용 가능.

 

#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>
using namespace std;

int main()
{
	set<int> container;
	for (int i = 0; i < 10; ++i)
		container.insert(i);

	for (auto itr = container.begin(); itr != container.end(); ++itr)
		cout << *itr << " ";
	cout << endl;
	return 0;
}

set의 경우.

 

#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>
using namespace std;

int main()
{
	map<int, char> container;
	for (int i = 0; i < 10; ++i)
		container.insert(make_pair(i, char(i + 65)));

	for (auto itr = container.begin(); itr != container.end(); ++itr)
		cout << itr->first << " " <<itr->second  << endl;
	cout << endl;
	return 0;
}

map의 경우.

 

16.3 STL 알고리즘 소개

 

#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <algorithm>
using namespace std;

int main()
{
	vector<int> container;
	for(int i = 0; i < 10; ++i)
		container.push_back(i);

	//auto itr = li.begin();
	//list<int>::const_iterator itr;

	auto itr = min_element(container.begin(), container.end());
	cout << *itr << endl;
	cout << endl;

	itr = max_element(container.begin(), container.end());
	cout << *itr << endl;
	cout << endl;

	itr = find(container.begin(), container.end(), 3);
	container.insert(itr, 128);

	for (auto& e : container) cout << e << " ";
	cout << endl;

	sort(container.begin(), container.end());
	//li.sort();

	for (auto& e : container) cout << e << " ";
	cout << endl;

	reverse(container.begin(), container.end());
	//li.reverse();

	for (auto& e : container) cout << e << " ";
	cout << endl;
	return 0;
}

 

list는 sort와 reverse가 내장되어 있으므로 멤버 함수로 호출하면 된다.