欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在程序中使用STL(第7章)(条款43)

程序员文章站 2022-07-13 22:08:06
...

条款43:算法调用优先于手写的循环

有三个理由

效率:算法通常比程序员自己写的循环效率更高;

正确性:自己写循环比使用算法更容易出错;

可维护性:使用算法的代码通常比手写循环的代码更加简洁明了;

书中的例子

   void dequeTest() {
        deque<int> dq{2, 3, 4};
        dq.push_back(5);
        dq.push_front(1);
        auto idq = dq.insert(dq.cbegin(), 0); // 注意,插入后返回插入节点的迭代器
        idq = dq.insert(dq.cend(), 6); // 注意,插入后返回插入节点的迭代器

        int arr[]{11, 12, 13, 14, 15}; // 测试用数据
        const int N = 5;

        // 不使用算法的例子,需要消息维护迭代器的有效性
        auto initer = dq.begin();
        for (int i = 0; i < N; ++i) {
            initer = dq.insert(initer, arr[i] + 10);
            ++initer;
        }

        // 使用算法的例子
        // 1)将数组依次插入到deque后面
        std::copy(arr, arr + N, std::back_inserter(dq));
        // 2)将数组按照原来的顺序依次+10后插入deque前面,采用lambda表达式实现
        std::transform(std::begin(arr), std::end(arr), std::inserter(dq, dq.begin()),
                       [](int x) { return x + 10; });  // lamada表达式
        // 3)将数组按照原来的顺序依次+10后插入deque前面,采用bind 标准函数对象实现
        std::transform(std::begin(arr), std::end(arr), std::inserter(dq, dq.begin()),
                       std::bind(std::plus<int>(), std::placeholders::_1, 10));  // bind标准函数对象

        return;
    }

输出:

在程序中使用STL(第7章)(条款43)

书中还举了个例子,有些场景下使用循环更清晰,不过作者出版树的时候C++11还没有面世,因此那个例子是合理的,现在有lambda,书中那个例子也可以用算法优雅的完成,代码如下

  void dequeTest() {
        // 想要表明在一次迭代中完成什么工作,则使用循环比算法更为清晰
        std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};
        int lowbound = 4;
        int upperbound = 6;
        auto iter = vec.begin();
        for (; iter != vec.end(); ++iter) {
            if (*iter > lowbound && *iter < upperbound) {
                break;  // *iter == 5
            }
        }

        // 然而新版的C++也不是如此了,以前做法确实比较麻烦,还需要写个函数对象,或者采用其他方式,现在有lambda
        auto i = std::find_if(vec.begin(), vec.end(), [=](int e) { return e > lowbound && e < upperbound; });

        return;
    }