따라하며 배우는 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가 내장되어 있으므로 멤버 함수로 호출하면 된다.
'개발 공부 > C++' 카테고리의 다른 글
따라하며 배우는 C++ 18. 입력과 출력 (0) | 2020.07.03 |
---|---|
따라하며 배우는 C++ 17. string 문자열 클래스 (0) | 2020.07.03 |
따라하며 배우는 C++ 15. 의미론적 이동과 스마트 포인터 (0) | 2020.07.03 |
따라하며 배우는 C++ 14. 예외 처리 (0) | 2020.07.02 |
따라하며 배우는 C++ 13. 템플릿 (0) | 2020.07.02 |