tinystl实现(第十一步:uninitialized.cpp)
程序员文章站
2022-05-24 19:06:02
...
经过长时间的学习终于可以开始tinystl的仿(chao)写工作了,本文参考了这位大神的博客,坦白讲我只是补充了注释,因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验,所以只能这样做,不过相信能够有助于大家的学习
#强烈建议按顺序阅读本专栏
#pragma once
#ifndef _UNINITIALIZED_FUNCTIONS_H_
#define _UNINITIALIZED_FUNCTIONS_H_
#include"Algorithm.h"
#include"Construct.h"
#include"Iterator.h"
#include"TypeTrails.h"
namespace mySTL {
template<class InputIterator,class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _true_type);
template<class InputIterator, class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _false_type);
//是否为pod类型采取方式不同
template<class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(InputIterator first, InputIterator last, InputIterator result)
{
typedef typename _type_traits<iterator_traits<InputIterator>::value_type>::is_POD_type isPODType;
return _uninitialized_copy_aux(first, last, result, isPODType());
}
template<class InputIterator, class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _true_type) {
memcpy(result, first, (last - first) * sizeof(*first));
return result + (last - first);
}
template<class InputIterator, class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _false_type) {
int i = 0;
for (; first != last; ++first, ++i) {
construct((result + i), *first);//对空白内存调用construct
}
return (result + i);
}
//对空白区域传参填入
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _true_type);
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _false_type);
template<class ForwardIterator, class T>
void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& value) {
typedef typename _type_traits<T>::is_POD_type isPODType;
_uninitialized_fill_aux(first, last, value, isPODType());
}
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _true_type) {
fill(first, last, value);
}
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _false_type) {
for (; first != last; ++first) {
construct(first, value);
}
}
//局部赋值
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_fill_n_aux(ForwardIterator first,
Size n, const T& x, _true_type);
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_fill_n_aux(ForwardIterator first,
Size n, const T& x, _false_type);
template<class ForwardIterator, class Size, class T>
inline ForwardIterator uninitialized_fill_n(ForwardIterator first,
Size n, const T& x) {
typedef typename _type_traits<T>::is_POD_type isPODType;
return _uninitialized_fill_n_aux(first, n, x, isPODType());
}
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_fill_n_aux(ForwardIterator first,
Size n, const T& x, _true_type) {
return fill_n(first, n, x);
}
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_fill_n_aux(ForwardIterator first,
Size n, const T& x, _false_type) {
int i = 0;
for (; i != n; ++i) {
construct((T*)(first + i), x);
}
return (first + i);
}
}
#endif // ! _UNINITIALIZED_FUNCTIONS_H_
上一篇: 第十三章 Quartz
下一篇: oracle更新数据方式