将对象方法从向量应用于C 的第二个向量中的对象

Apply an Object method from an vector to objects in a second vector in C++

本文关键字:向量 对象 第二个 应用于 方法      更新时间:2023-10-16

我正在尝试找到一种优雅的方法来执行以下循环:

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)

谢谢您,如果您知道存在任何可以做到的功能。

只是尝试:

auto&& it=b.begin();
for_each(a.begin(), a.end(),[&](value_type& v){v.Method(*it++)});

这是一个非常特殊的用例也许是什么?(远离工业实力实施。(

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);

您可以使用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>,要使用此功能。

std::transform似乎很可能符合您的要求:

template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first,
                    UnaryOperation unary_op );

如果您只想做一次事情,而不仅仅是使用循环,如果您打算进行规则,那么为什么不使用自己喜欢的界面制作自己的函数。以下是我要做的。

// 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);
}