SGISTL源码探究-stl_algobase.h中的算法

本文深入探讨了STL头文件stl_algobase.h中的基础算法,包括iter_swap、swap、min、max、copy、copy_backward、fill、mismatch、equal和lexicographical_compare。这些算法体现了泛型编程思想,如使用迭代器、模板和比较操作。文章还强调了在实现中如何优化效率,特别是对于copy和fill的复杂实现。
摘要由CSDN通过智能技术生成

前言

在上一小节中,我们分析了stl_numeric.h中的算法部分。在本小节中,我们将分析stl_algobase.h文件中的算法,里面实现的都是一些比较基本的算法,比如equalfillmaxswap等,可以从中学习到泛型的思想。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值