全部代码
#pragma once
// util.h中主要包括一些通用工具,包括 move, forward, swap 等函数,以及 pair 等
#include "type_traits.h"
namespace tinySTL {
// move
// 如果想取得对某一对象执行移动操作,不要将其声明为常量,因为针对常量对象执行的
// 移动操作将变换为复制操作
template<typename T>
remove_reference_t<T>&& move(T&& arg) noexcept {
return static_cast<remove_reference_t<T>&&>(arg);
}
// forward
// 凡是使用forward来实现完美转发的,接受参数时都应该写成 void f(T&& x)
// { g(std::forward<T>(x)); }这样, 即 f 接受的参数类型必须是T&&, g 接
// 受的参数应该是std::foward<T>(x)
template<typename T>
T&& forward(remove_reference_t<T>& arg) noexcept {
return static_cast<T&&>(arg);
}
template<typename T>
T&& forward(remove_reference_t<T>&& arg) noexcept {
return static_cast<T&&>(arg);
}
// swap
template<typename T>
void swap(T& lhs, T& rhs) {
auto tmp(tinySTL::move(lhs));
lhs = tinySTL::move(rhs);
rhs = tinySTL::move(tmp);
}
template<typename ForwardIter1, typename ForwardIter2>
ForwardIter2 swap_range(ForwardIter1 first1, ForwardIter1 last1, ForwardIter2 first2) {
for (; first1 != last1; ++first1, ++first2) {
tinySTL::swap(*first1, *first2);
}
return first2;
}
template <typename Tp, size_t N>
void swap(Tp(&a)[N], Tp(&b)[N]) {
tinySTL::swap_range(a, a + N, b);
}
/*------------------------------------------------------------------------------------*/
// pair
template<typename T1, typename T2>
struct pair {
using first_type =