从派生向量 class 复制到基础向量 class

Copying from vector of derived class to vector of base class

我正在寻找最简单的方法来将派生 class 的向量复制到基础 class 的向量,而无需逐个元素地进行。我如何解决以下问题才能使其正常工作?

#include <vector>
#include <iostream>

struct A {
    A( int a) : a(a) {}
    int a;
};

struct B : public A {
    B (int a, int b) : A (a), b(b) {}
    int b;
};

int main() {
    std::vector<B> vb { B{1,2}, B{3,4}};
    std::vector<A> va = vb;
    for (const auto& item : va) {
        std::cout << item.a << " ";
    }
    std::cout << std::endl;
    return 0;
}

现在我从 g++

收到以下错误消息
error: conversion from ‘vector<B>’ to non-scalar type ‘vector<A>’ requested
   16 |     std::vector<A> va = vb;

std::vector<A>不能直接从std::vector<B>转换过来,它们本质上是两个独立的类型。

您可以使用 vb 的迭代器初始化 va

std::vector<A> va { vb.begin(), vb.end() };

请注意,va 的元素将被切片复制。

如果你更喜欢组合而不是继承,你可以使用:

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

struct A {
    int a;
};

struct B {
    A a;
    int b;
};

int main() {
    std::vector<B> vb { {1 ,2},{3, 4} };
    std::vector<A> va;
    std::transform(vb.begin(), vb.end(), std::back_inserter(va), 
            [](const B& b) -> A { return b.a; } );
    for (const auto& item : va) {
        std::cout << item.a << " ";
    }
    std::cout << std::endl;
    return 0;
}