You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写可转换基础容器中多个值的迭代器包装器?

问题:基于迭代器的多源值转换优化(避免显式生成中间容器)

我有一个依赖迭代器的算法,但在需要转换多个源值时遇到了问题——现有的转换迭代器只能接收单个参数进行转换。

原始代码示例

template<typename ForwardIt>
double some_algorithm(ForwardIt begin, ForwardIt end) {
    double result = 0;
    for (auto it = begin; it != end; ++it) {
        double t = *it;
        /*
            do some calculations..
        */
        result += t;
    }
    return result;
}

int main() {
    {
        std::vector<double> distances{ 1, 2, 3, 4 };
        double t = some_algorithm(distances.begin(), distances.end());
        std::cout << t << std::endl;
        /* works great */
    }

    {
        /* 现在处理点集.. */
        std::vector<double> points{ 1, 2, 4, 7, 11 };

        /* 转换为距离值.. */
        std::vector<double> distances;
        distances.resize(points.size() - 1);
        for (size_t i = 0; i + 1 < points.size(); ++i)
            distances[i] = points[i + 1] - points[i];

        /* 调用算法 */
        double t = some_algorithm(distances.begin(), distances.end());
        std::cout << t << std::endl;
    }
}

需求:避免显式生成中间容器

我想知道是否存在方法(尤其是使用标准库)创建这类迭代器包装器,从而无需显式生成distances这样的中间值。

理想的迭代器包装器实现

template<typename BaseIterator, typename TransformOperator>
struct GenericTransformIterator {
    GenericTransformIterator(BaseIterator it, TransformOperator op) : it(it), op(op) {}

    auto operator*() {
        return op(it);
    }

    GenericTransformIterator& operator++() {
        ++it;
        return *this;
    }

    BaseIterator it;
    TransformOperator op;

    friend bool operator!=(GenericTransformIterator a, GenericTransformIterator b) {
        return a.it != b.it;
    }
};

理想的使用方式

{
    /* 处理点集.. */
    std::vector<double> points{ 1, 2, 4, 7, 11 };

    /* 使用通用转换迭代器.. */
    /* 调用算法 */
    auto distance_op = [](auto it) {
        auto next_it = it;
        ++next_it;
        return *next_it - *it;
    };
    double t = some_algorithm(
        generic_transform_iterator(points.begin(), distance_op), 
        generic_transform_iterator(points.end() -1 , distance_op));
    std::cout << t << std::endl;
}

核心思路

转换函数不作用于底层对象,而是作用于迭代器(或至少持有索引值,通过lambda捕获整个容器并以索引访问)。我曾使用Boost的各类迭代器包装类,但自C++20及Ranges特性出现后,想了解是否可以用标准库现有工具替代自定义包装器。


内容的提问来源于stack exchange,提问作者user2561762

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:55:16