2.1 유용한 함수들

2.1.1 std::min, std::max, std::minmax

#include <algorithm>

std::min(a, b);   //a와 b 중에서 최솟값 반환
std::min(a, b, comp);   //predicate comp를 이용해 a와 b 중에서 최솟값 반환
std::min(initializer_list);   //initializer list에 있는 값 중에서 최소값 반환
std::min(initializer_list, comp);   //predicate comp를 이용해 initializer list 중 최소값 반환

std::max(a, b);   //a와 b 중에서 최댓값 반환
std::max(a, b, comp);   //predicate comp를 이용해 a와 b 중에서 최댓값 반환
std::max(initializer_list);   //initializer list에 있는 값 중에서 최댓값 반환
std::max(initializer_list, comp);   //predicate comp를 이용해 initializer list 중 최댓값 반환

//pair 형식으로 저장
std::minmax(a, b);   //a와 b 중에서 최솟값과 최댓값 반환
std::minmax(a, b, comp);   //predicate comp를 이용해 a와 b 중에서 최솟값과 최댓값 반환
std::minmax(initializer_list);   //initializer list에 있는 값 중에서 최솟값과 최댓값 반환
std::minmax(initializer_list, comp);   //predicate comp를 이용해 initializer list 중 최솟값과 최댓값 반환

2.1.1 std::move

#include <iostream>
#include <utility>
#include <vector>

std::vector<int> myBigVec(1000000, 2011);

/* Copy Semantics */
std::vector<int> myVec1 = myBigVec;

/* Move Semantics */
//기존 RValue Reference 사용법
std::vector<int> myVec2 = static_cast<std::remove_reference<decltype(myBigVec)>::type&&>(myBigVec);
//std::move()
std::vector<int> myVec3 = std::move(myBigVec);

std::forward

#include <utility>

struct MyData{
	MyData(){};
	MyData(int, double, char){};
};

//가변인수 템플릿 + forwarding
template <typename T, typename ... Args> T createT(Args&&...args){
	return T(std::forward<Args>(args)...);  
}

int main(void){
	int a = createT<int>();
	int b = creatT<int>(1);
	
	std::string s = createT<std::string>("Only for testing purpose");

	MyData myData = createT<MyData>();
	MyData myData2 = createT<MyData>(1, 3.19, 'a');

	typedef std::vector<int> IntVec;
	intVec intVec = createT<IntVec>(std::initializer_list<int>({1, 2, 3, 4, 5}));
}

std::swap

#include <utility>

template <typename T>
void swap(T& a, T& b){
	T tmp(std::move(a));   //move를 활용한 swap
	a = std::move(b);
	b = std::move(tmp);
}