如何使C算法融合?

考虑以下C程序,在给定数字向量的情况下打印最小的相邻差异:

#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main()
{
    std::vector<int> numbers = { 10, 1, 43, 59, 78, 46, 63, 12 };

    std::vector<int> deltas;
    std::adjacent_difference( numbers.begin(),
                              numbers.end(),
                              std::back_inserter( deltas ) );

    auto minEl = std::min_element( deltas.begin() + 1,
                                   deltas.end() );

    std::cout << *minEl;
}

我想摆脱中间的增量向量,但仍然继续使用std :: adjacent_difference和std :: min_element(而不是循环自己).

在函数式语言中,中间数据结构的标准通常称为deforestation(或“融合”).在C中有同样的方法吗?

我想有可能设计某种迭代器包装器,它允许在min_element迭代范围时递增地计算相邻差异.我在标准库中找不到类似的东西.也许某些第三方库(Boost?)提供类似的东西?

最佳答案 我猜测(并且希望)你会得到一些更好的答案,但如果你足够热衷于充实一些辅助代码库,这是一种方法:

#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
#include <algorithm>

template <typename T>
struct min
{
    typedef T element_type;
    min(int& min) : min_(min) { }
    min& operator *() { return *this; }
    min& operator=(const T& t)
    {
        if (first_)
            min_ = t, first_ = false;
        else if (t < min_)
            min_ = t;
    }
    min& operator++() { return *this; }
    bool first_ = true;
    T& min_;
};

template <typename Iterator>
struct skip_take  // i.e. skip some elements, take some elements...
{
    skip_take(Iterator i, size_t skip, size_t take = size_t(-1))
      : i_(i), skip_(skip), take_(take)
    { }
    skip_take& operator *() { return *this; }
    skip_take& operator=(const typename Iterator::element_type& t)
        { if (skip_ == 0 && take_) *i_ = t; }
    skip_take& operator++()
        { if (skip_) --skip_; else if (take_) --take_, ++i_; return *this; }
    Iterator& i_;
    size_t skip_, take_;
};

int main()
{
    std::vector<int> numbers = { 10, 1, 43, 59, 78, 46, 63, 12 };

    int result;
    std::adjacent_difference(numbers.begin(), numbers.end(),
                             skip_take<min<int>>(min<int>(result), 1));

    std::cout << result << '\n';
}

(代码ideone.com)

更一般地说,对于这种事情的良好实现有点受到C的缺乏协同程序(许多其他语言中的懒惰生成器使用它们 – 有一个提升库或提议这种浮动 – 不确定如何可用)的挫折感,以及标准库对范围内迭代器的偏好(使得一个算法更难以返回下一个算法应该操作的范围). C语言有很多“功能”库,它们使用模板表达式和其他比上面的代码更复杂的技术,效果很好.

点赞