c++ stl 源码分析
list类之merge函数
template <class _Tp, class _Alloc>
void list<_Tp, _Alloc>::merge(list<_Tp, _Alloc>& __x)
{
iterator __first1 = begin();
iterator = end();
iterator __first2 = __x.begin();
iterator __last2 = __x.end();
while (__first1 != __last1 && __first2 != __last2)
if (*__first2 < *__first1) {
iterator __next = __first2;
transfer(__first1, __first2, ++__next);
__first2 = __next;
}
else
++__first1;
if (__first2 != __last2) transfer(__last1, __first2, __last2);
}
c++ stl源码基于泛型编程, 模板参数_Tp _Alloc分别代表操作的数据类型和为数据分配内存的操作类,merge的前提是两个list都已经经过递增排序,此函数通过在list1(this)本身上的iterator进行插入操作, transfer函数的第一个参数表示插入位置为该参数的前一个位置, 第二个与第三个参数表示将被插入数据的起始位置 与终结位置(不包含), 先将list2内置的开始迭代器__first2的存值与list1内置的开始迭代器__first1的存值比较, 如果*__first2 < __first1 , 就将__first2就代表的迭代器插入到__first1的前面, __first2指向下一个位置 , 再与__firs1做比较, 如果*__first2 >= *__first1, ++__first1 first1指向下一个迭代器,循环的结束条件是_first1 != __last1 && __first2 != __last2, 只要list1或者list2有一个的迭代器有一个到达结尾就停止循环, 假如是list1的全部已经迭代完, list2未完成迭代, 则将list2迭代剩下部分插入__last1 的前面
感言
既然选择了做程序猿, 为了职业生涯, 必须得不断学习提升自己挑战自己, 彩虹总在风雨后