使用并行参数向量调用元素向量的成员函数
Call a member function of a vector of elements with a vector of arguments in parallel
给定这段代码:
struct T
{
void f(int const);
};
void f(std::vector<T> &u, std::vector<int> const &v)
{
for (std::size_t i = 0; i < u.size(); ++i)
u[i].f(v[i]);
}
有没有标准方法来并行化void f(std::vector<T> &u, std::vector<int> const &v)
体?
这恰好是偶然工作的(https://godbolt.org/z/gRv9Ze(:
void f(std::vector<T> &u, std::vector<int> const &v)
{
auto const indices = std::views::iota(0u, u.size()) | std::views::common;
std::for_each(std::execution::par_unseq, std::begin(indices), std::end(indices),
[&](std::size_t const i) { u[i].f(v[i]); });
}
但据报道,依赖这种行为是错误的(请参阅此错误报告 和这个答案(。事实上,这不是并行运行的(https://godbolt.org/z/MPGdHF(:
void f(std::vector<T> &u, std::vector<int> const &v)
{
std::ranges::iota_view<std::size_t, std::size_t> const indices(0u, u.size());
std::for_each(std::execution::par_unseq, std::begin(indices), std::end(indices),
[&](std::size_t const i) { u[i].f(v[i]); });
}
我很确定应该有一种标准方法可以让这样的函数并行运行。我可能错过了一个明显的 算法,但std::transform
在这里似乎不合适,其他的更不合适。
保持在std
以内,最好的选择是使用忽略给定内容的输出迭代器std::transform
struct unit_iterator {
using difference_type = std::ptrdiff_t;
using value_type = std::tuple<>;
using pointer = std::tuple<> *;
using const_pointer = const std::tuple<> *;
using reference = std::tuple<> &;
using const reference = const std::tuple<> &;
using iterator_category = std::random_access_iterator_tag;
reference operator*() { return value; }
const_reference operator*() const { return value; }
reference operator[](difference_type) { return value; }
const_reference operator[](difference_type) const { return value; }
pointer operator->() { return &value; }
const_pointer operator->() const { return &value; }
unit_iterator& operator++() { return *this; }
unit_iterator operator++(int) { return *this; }
unit_iterator& operator+=(difference_type) { return *this; }
unit_iterator operator+(difference_type) const { return *this; }
unit_iterator& operator--() { return *this; }
unit_iterator operator--(int) { return *this; }
unit_iterator& operator-=(difference_type) { return *this; }
unit_iterator operator-(difference_type) const { return *this; }
difference_type operator-(unit_iterator) const { return 0; }
bool operator==(unit_iterator) const { return true; }
bool operator!=(unit_iterator) const { return false; }
bool operator<(unit_iterator) const { return false; }
bool operator<=(unit_iterator) const { return true; }
bool operator>(unit_iterator) const { return false; }
bool operator>=(unit_iterator) const { return true; }
private:
static value_type value;
};
void f(std::vector<T> &u, std::vector<int> const &v)
{
std::transform(std::execution::par_unseq, begin(u), end(u), begin(v), unit_iterator{},
[](T & u, int v) { u.f(v); return std::tuple<>{}; });
}
相关文章:
- 向量成员在管理类指针C++队列时丢失
- C++:更新类的向量成员变量
- C++ 入门 12.1:我可以在类中使用静态向量成员实现 StrBlob<string> 吗?
- 具有向量成员的基类<int>
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- 无法将类构造函数中新创建的对象复制到 C++ 中的向量成员
- 修改另一个类的向量成员时出错
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 如何在 C++ 中将结构类型向量数据输入到结构向量成员(嵌套结构向量)中
- std::向量成员变量 EXC_BAD_ACCESS
- 如何使用其定义附近的显式长度/值构造函数初始化向量成员变量
- "Empty"数组\向量成员 C++
- 如何使用初始值设定项列表初始化 2D 向量成员
- 如何在类定义中初始化向量成员变量
- 如何初始化结构的向量成员
- 使用向量<向量>成员实例化对象时的隔离错误<int>
- 为向量成员和更新元素指定默认值
- 保持类的向量成员与类实例连续
- C++:在类构造函数中填充向量后,向量成员被销毁
- 通过引用另一个类方法传递向量成员变量