C ++在结构向量上使用std :: transform

时间:2014-02-03 15:23:00

标签: c++ vector struct transform

我有一个C++应用程序struct看起来像:

struct test_struc {
    std::string name;
    int x;
    int y;
    std::vector<int> data;
};

我想根据结构中的std::vector<test_struc>元素使用行转换两个data。到目前为止,我有代码:

std::vector<test_struc> first = <from somewhere else>;
std::vector<test_struc> second = <from somewhere else>;

std::vector<int> result;
std::transform (second.begin(), second.end(), first.begin(), result.begin(), op_xor);

其中op_xor是:

int op_xor (int &i,
            int &j) {
    return  i^j;
}

如果firstsecondint的向量,这很有效,但由于它们不是,我不知道如何告诉代码使用{{1} } data的元素作为test_struc的参数。

我是在叫错树吗?或者有办法做到这一点吗?

4 个答案:

答案 0 :(得分:2)

请注意,至少使用现代编译器,您可能希望将该操作实现为lambda表达式,因此它看起来像:

std::transform(second.begin(), second.end(), 
               first.begin(),
               std::back_inserter(result),
               [](test_struct const &a, test_struct const &b) { 
                   return a.y ^ b.y; 
               });

轻微的一边:实际上,你有UB,当result.begin()的大小为0时,你试图通过result来写。你可以使用back_inserter,如上所述,或者你可以定义result将其大小初始化为second.size()

答案 1 :(得分:1)

你的二元仿函数必须带两个test_struct s:

int op_xor (const test_struct& i,
            const test_struct& j) 
{
    return  42; // replace wit your desired logic.
}

目前尚不清楚你想让这个仿函数做什么,但它应该在test_struct上运行并返回一个int。

答案 2 :(得分:0)

或者使用lambdas。 并记住其他向量的大小必须与“秒”相同或更多

  result.resize(second.size());
    std::transform(second.begin(), second.end(), first.begin(), result.begin(),
 [](test_struct & one, test_struct & two){ return one.x ^ two.x; });

但Jerry的back_inserter示例更好

答案 3 :(得分:0)

你也可以使用boost :: transform和boost phoenix lambdas:

#include <boost/range/algorithm.hpp>
#include <boost/phoenix.hpp>

using boost::phoenix::arg_names::arg1;
using boost::phoenix::arg_names::arg2;

boost::transform(second, first, std::back_inserter(result), (&arg1)->*&test_struc::x ^ (&arg2)->*&test_struc::x);

boost::transform的第一个和第二个参数是范围,因此您不必在此处写second.begin(), second.end(), first.begin()