gpt4 book ai didi

c++ - 有没有一种在转换后使用 views::filter 的有效方法? (范围适配器)

转载 作者:行者123 更新时间:2023-12-04 17:11:57 25 4
gpt4 key购买 nike

<分区>

views::filter 的奇怪行为的常见示例:

#include <iostream>
#include <ranges>
#include <vector>

int main ()
{
using namespace std;

auto ml = [](char c) // ml = make lambda (always accepts / transforms to 1)
{
return [c](int) {cout << c; return 1;};
};

vector<int> vec = {1};

auto view = vec
| views::transform (ml('T'))
| views::filter (ml('F'));

// use view somehow:
return *view.begin();
}

输出TFT(注意额外的T)。 demo


我们必须知道:

auto view = vec
| views::transform (ml('A'))
| views::filter (ml('B'));

...只是语法糖:

auto view = views::filter(views::transform(vec, ml('A')), ml('B'));

问题解释:

实现了一些mock versions views::filter 的问题似乎是:

  • 与其他迭代器不同,filter::iteratoroperator++ 期间工作(搜索可接受的值)
  • operator * 旨在提取值,但使用 filter::iterator 工作已经完成并丢失(我们不需要重新搜索一个可接受的值,但我们确实需要重新计算它)
  • 由于 constant-time copy constraint,我们无法存储结果对于 View (值可以是一个数组)

为了在图片中解释这一点,我们将展示迭代的过程:

view = container | Transform | Filter1 | Filter2 | Filter3

(为丑陋的图表道歉)圆圈代表正在为 Print F3 完成的工作 Pr(F3)(在模拟示例中完成的工作):

enter image description here

我们可以看到,如果我们只组合过滤器或只组合转换,那么我们就不会重复这项工作 - 问题在于过滤器位于转换上方(图中上方)。

在最坏的情况下,我们得到 [where n(x) number of x]:
n(迭代)= n(过滤器)* n(转换)
当我们期望 n(filters) + n(transforms)

我们可以通过 this example 看到这种抛物线与线性增长.


问题

有时需要先完成transform,然后才能确定要filter 的内容,那么如何避免额外的工作量呢?这似乎很重要,因为 View 旨在迭代容器,这是瓶颈领域。

有没有办法在这种情况下使用 std::views 而不会出现上述巨大的减速?

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