STL merge的实现细节

时间:2024-11-18 09:05:13
 //std::merge的两个版本

template<class InputIt1, class InputIt2, class OutputIt>  //First version
OutputIt merge(InputIt1 first1, InputIt1 last1,           //指向一个新容器的迭代器d_first
               InputIt2 first2, InputIt2 last2,
               OutputIt d_first)
{
    for (; first1 != last1; ++d_first) {//如果第一个容器为空,则执行return std::copy(first2,last2,d_first);
        if (first2 == last2) {
            return std::copy(first1, last1, d_first);     //如果第二个容器为空,则执行return std::copy(first1,last1,d_first);
        }
        if (*first2 < *first1) {                          //这个如果第二个迭代器指向的第二个容器的元素为空,那么是不是重载的迭代器返回的值为0呢
            *d_first = *first2;
            ++first2;
        } else {
            *d_first = *first1;                           //对两个已经排好序的容器的操作,应用了归并算法,
            ++first1;                                      //最后指向++first1时的前提是*first1<*first2;因此才能执行最后的return;
        }
    }
    return std::copy(first2, last2, d_first);
}

template<class InputIt1, class InputIt2,                  // Second version
         class OutputIt, class Compare>
OutputIt merge(InputIt1 first1, InputIt1 last1,           //指向一个新容器的迭代器d_first
               InputIt2 first2, InputIt2 last2,
               OutputIt d_first, Compare comp)
{
    for (; first1 != last1; ++d_first) {
        if (first2 == last2) {
            return std::copy(first1, last1, d_first);
        }
        if (comp(*first2, *first1)) {
            *d_first = *first2;
            ++first2;
        } else {
            *d_first = *first1;
            ++first1;
        }
    }
    return std::copy(first2, last2, d_first);
}

//std::copy的实现
template<class InputIt, class OutputIt>      //First version
OutputIt copy(InputIt first, InputIt last,
              OutputIt d_first)
{
    while (first != last) {
        *d_first++ = *first++;
    }
    return d_first;
}

template<class InputIt, class OutputIt, class UnaryPredicate>   //Sencond version
OutputIt copy_if(InputIt first, InputIt last,
                 OutputIt d_first, UnaryPredicate pred)
{
    while (first != last) {
        if(pred(*first))                                        //意图何在?函数指针
            *d_first++ = *first;
         first++;
    }
    return d_first;
}