前言
在上一小节中,我们分析了stl_numeric.h
中的算法部分。在本小节中,我们将分析stl_algobase.h
文件中的算法,里面实现的都是一些比较基本的算法,比如equal
、fill
、max
、swap
等,可以从中学习到泛型的思想。
stl_algobase.h中的算法
iter_swap
该函数的作用是交换迭代器指向的两个元素。注意迭代器的类型必须是ForwardIterator
及其派生类。
并且__iter_swap
的第三个参数是通过value_type
萃取出来的,定义迭代器的相应型别的作用就体现出来了。
//__iter_swap,供iter_swap调用
template <class ForwardIterator1, class ForwardIterator2, class T>
inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*) {
//交换*a和*b
T tmp = *a;
*a = *b;
*b = tmp;
}
//使用value_type取得迭代器指向的元素的类型
template <class ForwardIterator1, class ForwardIterator2>
inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) {
__iter_swap(a, b, value_type(a));
}
swap
该函数的作用是交换a和b的值
template <class T>
inline void swap(T& a, T& b) {
T tmp = a;
a = b;
b = tmp;
}
min
返回a和b中的较小值,可以传入任何类型,包括对象、容器等,只要重载了<操作符。
提供了两个版本,一个是使用<操作符进行比较;另一个版本是使用传入的仿函数comp进行比较。
template <class T>
inline const T& min(const T& a, const T& b) {
return b < a ? b : a;
}
template <class T, class Compare>
inline const T& min(const T& a, const T& b, Compare comp) {
return comp(b, a) ? b : a;
}
max
返回a和b中的较大值,可以传入任何类型,包括对象、容器等,只要重载了<操作符。
提供了两个版本,一个是使用<操作符进行比较;另一个版本是使用传入的仿函数comp进行比较。
template <class T>
inline const T& max(const T& a, const T& b) {
return a < b ? b : a;
}
template <class T, class Compare>
inline const T& max(const T& a, const T& b, Compare comp) {
return comp(a, b) ? b : a;
}
copy
copy
函数的实现比较复杂,这都是为了能选取合适的操作取得最佳的效率。
/* 将[first, last)的元素拷贝到[result, result + (last - first))中,然后返回result,此时result指向的是尾端
* 要求迭代器的类型是最基本的InputIterator型
*/
template <class InputIterator, class OutputIterator>
inline OutputIterator __copy(InputIterator first, InputIterator last,
OutputIterator result, input_iterator_tag)
{
for ( ; first != last; ++result, ++first)
*result = *first;
return result;
}
/* 这个版本的提供了Distance类型作为最后一个参数,我们并不关注它的变量名,因为只需要取得该类型就行了
* 上一个版本因为是拿迭代器进行比较的,所以效率较低
* 这个版本检测到迭代器支持随机访问,所以通过`[first, last)`之间的距离作为循环条件
*/
template <class RandomAccessIterator, class OutputIterator, class Distance>
inline OutputIterator
__copy_d(RandomAccessIterator first, RandomAccessIterator last,
OutputIterator result, Distance