C++ 표준 라이브러리인 STL에 대해서 학습하는 시리즈입니다. 단순한 STL의 사용법 뿐 아니라 STL의 주요 요소를 직접 구현해 보면서 STL의 설계 철학도 배우게 됩니다.

  1. STL의 단순한 개념뿐 아니라 iterator_category, iterator_traits 등의 깊이 있는 개념을 배우게 됩니다.
  2. shared_ptr<>, weak_ptr<>, unique_ptr<>등의 스마트 포인터에 대해서 배우게 됩니다.
  3. thread/future/async 등 스레드 관련 라이브러리를 배우게 됩니다.

STL Preview

STL 소개

  • 1980~, C++ 탄생

  • C++98/03 : STL 처음 소개 ( 자료구조, 알고리즘 표준에서 제공)

  • C++11/14 : 다양한 종류의 STL 라이브러리 ( Hash, 스마트포인터, 멀티스레드 지원, atomic 등등)

  • C++17 : 병렬 프로그래밍 concept 개념

과정 소개

  1. STL 소개와 간단한 유틸리티 라이브러리 사용법
  2. STL의 설계 원리
  3. STL의 각 분야별 특징과 핵심 개념, 주의 사항
  4. STL의 각 라이브러리의 사용 방법, 활용 방법
  5. C++98/03/11/14/17의 STL
  6. C++20 라이브러리 간단 소개

C++ 관련 참고 사이트

  1. www.cppreference.com : 레퍼런스 참조
  2. www.isocpp.org : C++ 표준 관련 정보
  3. www.boost.org : C++20/23 등에 추가 될 라이브러리를 미리 경험

std::bitset

  1. bit를 관리하는 클래스

  2. 헤더

  3. cout, cin으로 입출력 가능

  4. 변환 함수 제공

    • to_string(), to_ulong(), toullong() 등
  5. 조사 함수 제공

    • test, all, none, any, count
  6. 비트 연산 가능 : &(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

  1. 서로 다른 타입의 객체를 2개 보관하는 타입
  2. 헤더
  3. first, second 멤버를 통해서 저장 요소에 접근
  4. 함수가 2개의 값을 리턴하고 싶을 때
  5. tuple -> pair를 보다 일반화한 타입
  6. 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..
}