C++ STL - Preview[1]
C++ 표준 라이브러리인 STL에 대해서 학습하는 시리즈입니다. 단순한 STL의 사용법 뿐 아니라 STL의 주요 요소를 직접 구현해 보면서 STL의 설계 철학도 배우게 됩니다.
- STL의 단순한 개념뿐 아니라 iterator_category, iterator_traits 등의 깊이 있는 개념을 배우게 됩니다.
- shared_ptr<>, weak_ptr<>, unique_ptr<>등의 스마트 포인터에 대해서 배우게 됩니다.
- thread/future/async 등 스레드 관련 라이브러리를 배우게 됩니다.
STL Preview
STL 소개
1980~, C++ 탄생
C++98/03 : STL 처음 소개 ( 자료구조, 알고리즘 표준에서 제공)
C++11/14 : 다양한 종류의 STL 라이브러리 ( Hash, 스마트포인터, 멀티스레드 지원, atomic 등등)
C++17 : 병렬 프로그래밍 concept 개념
과정 소개
- STL 소개와 간단한 유틸리티 라이브러리 사용법
- STL의 설계 원리
- STL의 각 분야별 특징과 핵심 개념, 주의 사항
- STL의 각 라이브러리의 사용 방법, 활용 방법
- C++98/03/11/14/17의 STL
- C++20 라이브러리 간단 소개
C++ 관련 참고 사이트
- www.cppreference.com : 레퍼런스 참조
- www.isocpp.org : C++ 표준 관련 정보
- www.boost.org : C++20/23 등에 추가 될 라이브러리를 미리 경험
std::bitset
bit를 관리하는 클래스
헤더
cout, cin으로 입출력 가능
변환 함수 제공
- to_string(), to_ulong(), toullong() 등
조사 함수 제공
- test, all, none, any, count
비트 연산 가능 : &(and) |(or) ^(not)
#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main()
{
//bitset<8> b1; // 0
//bitset<8> b1 = 0xf0; // 11110000
bitset<8> b1 = 0b11110000;
b1.set(); // 모두 1로
b1.reset(); // 모두 0으로
b1.set(1); // 0000 0010
b1[2] = 1; // 0000 0110
b1[0].flip(); // 0000 0111
if (b1.test(1) == true) {}
if (b1[1] == true) {}
if (b1.none() == true) {}
int n2 = b1.count();
cout << n2 << endl; // 3
bitset<8> b2 = 0b00001111;
bitset<8> b3 = 0b11110000;
bitset<8> b4 = b2 | b3;
cout << b4 << endl;
cout << b1 << endl;
string s = b1.to_string();
unsigned long n = b1.to_ulong();
cout << s << endl;
cout << n << endl;
}
using std::pair
- 서로 다른 타입의 객체를 2개 보관하는 타입
- 헤더
- first, second 멤버를 통해서 저장 요소에 접근
- 함수가 2개의 값을 리턴하고 싶을 때
- tuple -> pair를 보다 일반화한 타입
- make_pair를(STL 제공) 사용하면 템플릿 인자 전달 생략 가능(작성 편리성)
- pair를 만드는 helper 함수
- 클래스 템플릿은 인자를 생략 할 수 없기 때문에 항상 복잡하다
- 함수 템플릿은 인자를 생략 할 수 있기 때문에 간결한 표현 가능
- but, C++17 부터는 클래스 템플릿도 인자 생략 가능
#include <iostream>
#include <utility>
using namespace std;
// pair 를 인자로 전달 받는 함수.
template<typename T> void foo(T p)
{
cout << p.first << ", " << p.second << endl;
}
/*
// 함수 템플릿
template<typename T1, typename T2>
pair<T1, T2> make_pair(const T1& a, const T2& b)
{
return pair<T1, T2>(a, b);
}
*/
int main()
{
pair<int, double> p1(1, 3.4);
foo(p1);
foo(pair<int, int>(1, 1));
foo(make_pair(1, 1));
foo(pair(1, 1)); // C++17 부터 ok..
}