我有一个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;
}
如果first
和second
是int
的向量,这很有效,但由于它们不是,我不知道如何告诉代码使用{{1} } data
的元素作为test_struc
的参数。
答案 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()
。