使用std :: copy将一个结构的数组转换为另一个结构的Vector

时间:2014-09-19 06:25:27

标签: c++ algorithm

我想使用std :: copy将一个类(B)(C-legacy接口)的数组复制到另一个类(A)的向量中。 这很好,当A提供带有参数B的构造函数时,请参阅以下代码:

#include <algorithm>
#include <vector>

struct B
{
};

struct A
{
    A(){}

    #if 1
    A(const B& b)
    {
        // constructor converting B into A
    }
    #endif
};

A toA(const B& b)
{
    A rc;
    //free function converting B into A
    return rc;
}


int main()
{
    std::vector<A> VecA;
    B* arrayB;
    size_t elementsOfB;

    //here fill array B and elmentsOfB in C legacy code - does not matter for minimum example

    //now copy array of B into vector of A
    std::copy(arrayB, arrayB + elementsOfB, std::back_inserter(VecA));

    return 0;
}

该示例也可用Live Example

我想删除转换构造函数,而不想使用自由函数&#34; toA&#34;。当然,这不会编译(尝试&#34; #if 0&#34;在A的结构定义中),因为std :: copy希望有一个直接的函数来执行此操作。

有没有办法使用带自由函数的std :: copy?

1 个答案:

答案 0 :(得分:4)

正如其名称所示,std::copy用于将对象从一个地方复制到另一个地方。这就是它不提供转换接口的原因。

当需要从一种类型转换为另一种类型时,应使用std::transform。这允许您提供一元操作来实现从一种类型的对象到另一种类型的对象的转换:

std::transform(arrayB, arrayB + elementsOfB, std::back_inserter(VecA), toA);

<强> Working example

#include <algorithm>
#include <vector>
#include <iostream>

struct B {};
struct A {};

A toA(const B&) { 
    std::cout << "B ==> A\n";
    return A(); 
}

int main()
{
    std::vector<A> vecA;
    B arrayB[10];
    std::transform(arrayB, arrayB + 10, std::back_inserter(vecA), toA);
}