thrust :: transform_reduce如何在一元运算中访问迭代器?

时间:2013-02-14 07:31:00

标签: c++ stl functor thrust

我正在尝试对结构矢量执行变换减少。该结构包含两个数字。我希望一元函数对这两个数字做一些事情,并为我的向量中的每个结构返回一个值,并使用这些值的总和进行减少。如何编写我的仿函数来访问结构中的值?

例如,函数中的mystruct.value1的正确语法是什么?:

struct unary_op
{
    float operator()()
    {
        return mystruct.value1 + mystruct.value2; //function is a lot more complex 
    }
}

所以我可以这样做:

unary_op uop1;
thrust::transform_reduce(myvec.begin(), myvec.end(), uop1, 0, thrust::add)

1 个答案:

答案 0 :(得分:1)

声明: 既然你显然没有发布实际代码而你的例子看起来像一些不相关的代码行,我的答案可能不是你想要的 - SSCCE会很好。

如果我理解正确,您希望将MyStruct s的向量transform_reduce为所有结构成员值的总和。要做到这一点,你需要二进制加法(thrust::add)和一元运算MyStruct并返回其成员值的加法:

struct MyStruct {
  float value1;
  float value2;
};
std::vector<MyStruct> myvec;

/* fill myvec */

//C++11 with lambdas:
auto result = thrust::transform_reduce(begin(myvec), end(myvec), 
  [](MyStruct const& ms) { //unary op for transform
    return ms.value1 + ms.value2;
  },
  0, thrust::add);

//C++03 with a functor:
struct MyStructReducer {
  float operator()(MyStruct const& ms) {
    return ms.value1 + ms.value2;
  }
};

float result = thrust::transform_reduce(myvec.begin, myvec.end(), 
  MyStructReducer(), 0, thrust::add);

您也可以使用免费功能而不是Reducer类。

//C++03 with a function:
float reduceMyStruct(MyStruct const& ms) {
  return ms.value1 + ms.value2;
}

/* ... */
float result = thrust::transform_reduce(myvec.begin, myvec.end(), 
  reduceMyStruct, 0, thrust::add);

HTH