相关疑难解决方法(0)

C++ 中是否有与 Python range() 等效的函数?

我想用来std::for_each并行迭代范围内的向量索引,计算Weierstrass 函数[a, b)的值并将其写入:std::vector

std::vector<std::array<float, 2>> values(1000);
auto range = /** equivalent of Pyhthon range(0, values.size()) **/;

std::for_each(std::execution::par, range.begin(), range.end(), [&](auto &&i) {
    values[i][0] = static_cast<float>(i) / resolution;
    values[i][1] = weierstrass(a, b, static_cast<float>(i) / resolution);
});

// a, b, and resolution are some constants defined before
// weierstrass() is the Weierstrass function
Run Code Online (Sandbox Code Playgroud)

我在互联网上找到了一些解决方案,但所有这些解决方案都需要包含一些第三方库或创建我自己的范围类。有没有标准的解决方案?

c++ c++20

6
推荐指数
2
解决办法
1315
查看次数

在并行算法中使用range :: view :: iota

由于在没有基于索引的算法并行,我想知道是否可以结合使用来模拟。那是:ranges::view::iotastd::for_each

using namespace std;

constexpr int N= 10'000'000;
ranges::iota_view indices(0,N);
vector<int> v(N);

for_each(execution::par_unseq,indices.begin(),indices.end(),[&](int i) { v[i]= i; });
Run Code Online (Sandbox Code Playgroud)

iota_view似乎提供了对适当类型的随机访问([range.iota.iterator]):

iota_view<I, Bound>::iterator::iterator_category 定义如下:

(1.1) -如果I模型Advanceable,然后iterator_categoryrandom_access_iterator_tag

(1.2) -否则,如果I模型Decrementable,然后iterator_categorybidirectional_iterator_tag

(1.3) -否则,如果I模型Incrementable,然后iterator_categoryforward_iterator_tag

(1.4)-否则iterator_categoryinput_iterator_tag

上面的代码正确吗?使用iota_view这种方式是否会降低性能?


编辑:我已经使用range-v3cmcstl2和Intel的PSTL进行了一些测试。

使用range-v3,以上示例无法使用GCC …

c++ stl-algorithm range-v3 c++17 c++20

5
推荐指数
1
解决办法
1964
查看次数

标签 统计

c++ ×2

c++20 ×2

c++17 ×1

range-v3 ×1

stl-algorithm ×1