我正在寻找一种最简单的方法,将派生类的向量复制到基类的向量,而无需逐个元素。如何修复以下问题以使其正常工作?
#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;
}