如何复制std :: vector <boost :: shared_ptr <t>&gt;到std :: list <t>

时间:2015-10-12 08:05:44

标签: c++ boost vector

std::list<KinBody::Link::Geometry> geometries = link->GetGeometries();

link->GetGeometries()的类型为std::vector<boost::shared_ptr<Geometry>> 我用上面的代码得到了以下错误。

error: conversion from ‘const std::vector<boost::shared_ptr<OpenRAVE::KinBody::Link::Geometry> >’ to     non-scalar type ‘std::list<OpenRAVE::KinBody::Link::Geometry>’ requested
std::list<KinBody::Link::Geometry> geometries = link->GetGeometries();

我该怎么办?

3 个答案:

答案 0 :(得分:7)

std::list<KinBody::Link::Geometry> geometries;

for (auto const & p : link->GetGeometries())
    geometries.push_back(*p);

对于for (auto const & p : ...)部分,您需要启用C ++ 11支持(它使用自动类型推导和基于范围的for循环)。

Pre-C ++ 11等价物是

std::list<KinBody::Link::Geometry> geometries;

typedef std::vector<boost::shared_ptr<KinBody::Link::Geometry>> geometries_vector_t;

geometries_vector_t const & g = link->GetGeometries();

for (geometries_vector_t::const_iterator i = g.begin(); i != g.end(); ++i)
    geometries.push_back(**i); // dereferencing twice: once for iterator, once for pointer

注意:这一切看起来都很不自然。作为共享指针返回的对象意味着KinBody::Link::Geometry实际上是基类或接口,或者此类型的对象很大,并且接口旨在避免大量复制或其他内容。我建议不要复制对象并将它们存储为界面建议的共享指针,除非你确实知道你需要副本。

答案 1 :(得分:4)

既然你提到了提升,那就告诉我一些Boost Range糖吧。

integral(g,-10,10,'arrayvalued',true);

这将导致包含link->getgeometries() | adaptors::indirected 元素的范围。使用Geometry&

填写列表
copy_range

查看完整的演示版:

<强> Live On Coliru

geometries = boost::copy_range<std::list<link::geometry>>(
        link->getgeometries() | adaptors::indirected
    );

答案 2 :(得分:-1)

该行

std::list<KinBody::Link::Geometry> geometries = link->GetGeometries();

尝试将矢量指定给列表。编译器告诉您不能这样做。你要做的是迭代向量并将每个元素插入列表。

请注意,向量包含指向几何的共享指针,而列表声明为包含实例。如果要在列表中存储指针,则必须将其声明为:

std::list<KinBody::Link::Geometry*>  // note the *