gpt4 book ai didi

c++ - 具有 STL 算法和 std::execution::par 执行策略的迭代器

转载 作者:太空狗 更新时间:2023-10-29 23:11:17 25 4
gpt4 key购买 nike

在为诸如 std::for_each 的 STL 算法指定 std::execution::par 执行策略时,如何使用迭代器?

在下面的示例中,我希望按如下方式对 Eigen3 矩阵的对角线求平方根:

template<typename T>
using Matrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;

template<typename T>
std::vector<T> getStdDev(const Matrix &x) const {
const size_t len = x.rows();
std::vector<T> stdDev(len);

// Generate indices.
size_t idx = 0;
std::vector<size_t> indices(len);
auto ind = [&idx]() {
return idx++;
};
std::generate(indices.begin(), indices.end(), ind);

// Take square root of diagonal elements.
auto sr = [&x](size_t i) {
stdDev[i] = std::sqrt(x(i, i));
};
std::for_each(std::execution::par, indices.begin(), indices.end(), sr);

return stdDev;
}

据我所知,上面的代码是线程安全的。但是,如何以线程安全的方式使用迭代器实现相同的效果,而不首先生成所需的索引,如上所述?假设要迭代的容器没有实现迭代器,或者没有线程安全的迭代器。

理想情况下,我希望通用地执行此操作(我知道 Eigen 有迭代器,它在这里仅用于示例目的)。

此外,最好只使用 C++ 功能(不使用库,但使用任何非草案标准)。

最佳答案

你可以使用类似 boost::counting_iterator 的东西或 ranges::view::iota

template<typename T>
std::vector<T> getStdDev(const Matrix &x) const {
const size_t len = x.rows();
std::vector<T> stdDev(len);

// Take square root of diagonal elements.
auto sr = [&x](size_t i) {
return std::sqrt(x(i, i));
};
std::transform(std::execution::par, boost::counting_iterator<int>(0), boost::counting_iterator<int>(len), stdDev.begin(), sr);

return stdDev;
}

自己实现一个 counting_iterator 并不难,只是指定 RandomAccessIterator 的所有必需成员很乏味。 .

class counting_iterator
{
public:
typedef size_t value_type;
typedef const size_t& reference;
typedef const size_t* pointer;
typedef ptrdiff_t difference_type;
typedef random_access_iterator_tag iterator_category;

explicit counting_iterator(size_t x);
size_t const& base() const { return m_inc; }
reference operator*() const { return m_inc; }
counting_iterator& operator++() { ++m_inc; return *this; }
counting_iterator& operator--() { --m_inc; return *this; }

counting_iterator& operator+=(size_t i) { m_inc += i; return *this; }
counting_iterator& operator-=(size_t i) { m_inc -= i; return *this; }

// and loads of others
private:
size_t m_inc;
};

关于c++ - 具有 STL 算法和 std::execution::par 执行策略的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51190805/

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