【问题标题】:Transforming a vector<std::unique_ptr<A>> to vector<A>将 vector<std::unique_ptr<A>> 转换为 vector<A>
【发布时间】:2020-06-20 15:44:24
【问题描述】:

有一个std::unique_ptr&lt;A&gt;的向量。我需要将该数据传递给需要A 向量的函数。

我尝试使用std::transform,像这样:

std::vector<std::unique_ptr<A>> a;

std::vector<A> aDirect;
std::transform(a.begin(), a.end(),
    std::back_inserter(aDirect),
    [](std::unique_ptr<A> element)-> A { return *element; });

但似乎std::transform 在某些时候尝试复制a 的元素,所以这不起作用,因为尝试引用已删除的函数而失败。

当然,我可以使用 for 循环手动执行此操作,但我想知道是否有更优雅的方式来执行此操作。

【问题讨论】:

  • 在调用std::tranform之前尝试aDirect.reserve(a.size());

标签: c++ vector std unique-ptr


【解决方案1】:

将 lambda 更改为 const &

[](std::unique_ptr<A> const &element)-> A { return *element; });

避免因在转换前调整保留正确大小而导致的副本。

std::vector<A> aDirect;
aDirect.reserve(a.size());
std::transform(a.begin(), a.end(),
               std::back_inserter(aDirect),
               [](std::unique_ptr<A> element) {
                   return *element;
               });

【讨论】:

  • 这将如何帮助消除在整个插入操作期间std::vector 反复重新分配自身时出现的所有副本?
  • 我尝试了 for 方法并得到了这个:for (const std::unique_ptr&lt;A&gt;&amp; element: a) { aDirect.push_back(*a); },它更紧凑且更具可读性。您提供的解决方案确实解决了原始问题。
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2023-03-23
  • 2016-03-31
  • 2019-10-20
  • 2020-12-07
相关资源
最近更新 更多