我试图找到一种优雅的方式来执行以下循环:
std::vector<A> a = {...};
std::vector<B> b = {...}; # assume a.size() == b.size()
for (int i = 0; i < a.size() ; ++i){
a[i].Method(b[i]);
}
我期待某种标准算法能够为我做到这一点,但也许它并不存在。也许是这样的:
std::apply(a.begin(),a.end(),b.begin(),Method)
如果您知道可以执行的任何功能,请感谢您。
答案 0 :(得分:1)
您可以使用std::transform
transform(a.begin(), a.end(), b.begin(), result.begin(), [&](A * obj, B * obj2) {return obj->Method(obj2); });
http://www.cplusplus.com/reference/algorithm/transform/
您必须#include <algorithm>
才能使用此功能。
答案 1 :(得分:1)
试一试:
auto&& it=b.begin();
for_each(a.begin(), a.end(),[&](value_type& v){v.Method(*it++)});
答案 2 :(得分:1)
这是一个非常特殊的用例,但你可以随时自己做饭 也许是这些方面的东西? (远离工业实力。)
template<typename a_iterator, typename b_iterator>
void zip_apply(a_iterator a_it, a_iterator a_end, b_iterator b_it, void (A::*fn)(const B&)
{
std::for_each(a_it, a_end, [&b_it, fn](A& a) { a.*fn(*b_it++); })
}
std::vector<A> as = ...;
std::vector<B> bs = ...;
zip_apply(as.begin(), as.end(), bs.begin(), &A::Method);
答案 3 :(得分:0)
似乎std::transform
最有可能符合您的要求:
template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first,
UnaryOperation unary_op );
答案 4 :(得分:0)
如果你只是做一次而不只是使用一个循环,如果你要定期做,那么为什么不用你喜欢的界面制作你自己的func。以下是我将如何去做。
// Non iterator version
template<class A, class B>
void apply_methodX(std::vector<A> & vec_a, std::vector<B> & vec_b, size_t len, void(A::*method)(B)) {
for (size_t i(0); i < len; ++i) {
(vec_a[i].*method)(vec_b[i]);
}
}
// Iterator version
template<class A, class B>
void apply_method_it(typename std::vector<A>::iterator first_a, typename std::vector<A>::iterator last_a, typename std::vector<B>::iterator first_b, void(A::*method)(B)) {
for (; first_a != last_a; ++first_a, ++first_b) {
(*first_a.*method)(*first_b);
}
}
Void main{
std::vector<A> vec_a;
std::vector<B> vec_b;
// assign blah blah into vectors…
apply_methodX<A, B>(vec_a, vec_b, vec_a.size(), &A::A_method);
apply_method_it<A, B>(vec_a.begin(), vec_a.end(), vec_b.begin(), &A::A_method);
}