【问题标题】:Is there a standard way to convert from container<Type1> to container<Type2>?是否有从 container<Type1> 转换为 container<Type2> 的标准方法?
【发布时间】:2011-04-06 04:17:44
【问题描述】:

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

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

有没有标准方法可以将 std::list&lt;A&gt; 转换为 std::list&lt;B&gt; ? (或者甚至从std::vector&lt;A&gt;std::list&lt;B&gt;)。

我知道我可以遍历列表并逐项构建第二个列表,但我想知道是否有更优雅的解决方案。

不幸的是我不能使用boost,但出于好奇,如果 boost 可以处理这个问题,我也很乐意知道如何处理。

【问题讨论】:

  • 我想这一定是以前问过的,但我找不到。

标签: c++ list containers


【解决方案1】:

嗯,是的。每个序列容器类型都有一个模板构造函数,它接受一对迭代器(一个迭代器范围)作为输入。它可以用于从另一个序列构造一个序列,而不管序列类型如何,只要序列元素类型可以相互转换。比如说

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`

【讨论】:

  • 我不敢相信它这么简单。我不敢相信我没有想到它。非常感谢;)
  • 如果A类型不能转换为B类型,应该是什么行为?
  • 取决于你在做什么,以及谁拥有列表,std::copy 可能也值得一看,可能带有插入器迭代器
  • @bjskishore123:它只会编译失败。诊断信息的位置、方式和方式 - 取决于实施。
  • +1:简单就是优雅。请注意,迭代器的范围也可以与insert 一起使用(关于这里提到的唯一注意事项)。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 2012-01-23
  • 2021-03-25
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多