Effective STL学习笔记-条款36

来源:互联网 发布:淘宝质检报告 编辑:程序博客网 时间:2024/06/06 12:26

了解copy_if的正确实现

先看copy和copy_if的使用小demo:

    vector<int> from(10);    std::iota(from.begin(), from.end(), 0); //0 - 9    vector<int> to;    //copy     std::copy(from.begin(), from.end(),        back_inserter(to));    std::copy(to.begin(), to.end(),        std::ostream_iterator<int>(std::cout, " "));    vector<int> to_;    //copy_if    std::copy_if(from.begin(), from.end(), back_inserter(to_), [=](const int value)    {        return value > 5;    });    std::copy(to_.begin(), to_.end(),        std::ostream_iterator<int>(std::cout, " "));

打印如下,0-9是to的容器你内容,6-9是to_的容器内容:
这里写图片描述

copy和copy_if的实现如下:

template<class InputIt, class OutputIt>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>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;}