gpt4 book ai didi

c++ - 如何在两个 C++20 范围上实现延迟计算的函数?

转载 作者:行者123 更新时间:2023-12-01 13:07:39 26 4
gpt4 key购买 nike

有一个zip_with Eric Niebler 提供的函数。

但是,既然 C++20 支持范围,我想构建类似的东西。
filter 的问题和 transform他们是在迭代一个范围吗?

我该怎么做呢?我已经坚持了一段时间,并且不愿意使用表达式模板。

例如,假设我有两个 vector M1{1,2,3} 和 M2{4,5,6}。

我想使用范围库来重载运算符以返回包含这两个矩阵加法的 View - M1+M2 := {5,7,9} .

使用 range-v3,我可以执行 auto sum = zip_with(std::plus,M1,M2);
上面的表达式是惰性求值的。如何使用 C++20 范围重新创建此表达式?

最佳答案

原理很简单。创建一个迭代器,为每个 vector 存储一个迭代器,当递增时,递增两个存储的迭代器,并且仅在取消引用时才进行加法。

这是一段说明原理的代码:

template <class It1, class It2>
struct adder_iterator{
It1 it1;
It2 it2;

decltype(auto)
operator++(){
++it1; ++it2;
return *this;
}

auto
operator *()const{
return *it1+*it2;
}
//....
};

您还需要实现一个哨兵和一个 View (从 std::view_interface 派生)。

哨兵是 end迭代器。您可以使用 adder_iterator类。但是你可以考虑优化:在你的 View 构造函数中,你确保最短的 vector 开始迭代器总是 it1 end 然后只使用这个迭代器来测试迭代的结束。你应该试试看。

关于c++ - 如何在两个 C++20 范围上实现延迟计算的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60727033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com