有没有标准的方法可以将 container<Type1> 转换为 container<Type2>?

8

我有两个类AB,并且存在一个隐式转换运算符从一个类转换到另一个类,因此:

A a;
B b;
b = a; // Works

有没有标准的方法将std::list<A>转换为std::list<B>?(甚至从std::vector<A>std::list<B>也可以)。
我知道可以遍历列表并逐个构建第二个列表,但我想知道是否有更优雅的解决方案。
不幸的是我不能使用boost,但作为一个额外的问题,如果boost可以处理这个问题,我很乐意了解如何处理。

我猜这个问题以前肯定被问过了,但我找不到它。 - ereOn
1个回答

15

是的,每种序列容器类型都有一个模板构造函数,它接受一个迭代器对(一个迭代器范围)作为输入。它可以用来从另一个序列构造一个序列,无论序列类型如何,只要序列元素类型可以相互转换。例如:

std::vector<A> v;
...
std::list<B> l(v.begin(), v.end());

另外,序列容器还有一个assign成员函数,它具有赋值语义(与初始化语义相对)并执行相同的操作。

std::vector<A> v;
std::list<B> l;
...
l.assign(v.begin(), v.end()); // replaces the contents of `l`

我简直不敢相信它是如此简单。而且我简直不敢相信我没有想到过。非常感谢 ;) - ereOn
如果A类型无法转换为B类型,应该采取什么行为? - bjskishore123
根据您正在执行的操作和列表的所有者,std::copy也可能值得一看,可能需要插入器迭代器。 - jk.
3
它将无法编译。具体情况取决于实现方式,会在何处、如何以及以什么诊断信息提示错误。 - AnT stands with Russia
+1:简单即是优雅。请注意,迭代器的范围也可以与insert一起使用(这是唯一没有提到的事情)。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接