将子类列表转换为超类列表

时间:2014-01-04 22:23:41

标签: c++

我正在尝试将std::set<B>转换为std::set<A>,其中:

class A {

}

class B : public A {

}

最快/最有效的方法是什么?

1 个答案:

答案 0 :(得分:2)

此*没有固定时间方法。您可以使用std::copythe constructor of std::set taking two iterators (aka "range constructor")获得最佳效果。

std::set<B> bs = ...;

std::set<A> as(bs.begin(), bs.end());

*在sizeof(B) == sizeof(A)的情况下,有一种快速但不安全的方式可以在恒定时间内转换它(即class B不会引入新成员)使用虚拟表(具有虚函数):您可以使用不安全的强制转换。但只有这样做才能知道你正在做什么非常好(它仍然是未定义的行为,但你的编译器可能会按预期进行)。对于使用指针以及指针不需要偏移时的情况也是如此(在使用多重继承或某些其他情况时可能就是这种情况,具体取决于您的编译器)。