从派生类的向量复制到基类的向量

  • 本文关键字:向量 基类 复制 派生 c++ stl
  • 更新时间 :
  • 英文 :


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

#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;
}

最新更新