繁体   English   中英

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

[英]How to copy std::vector<boost::shared_ptr<T>> to std::list<T>

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();

我该怎么办 ?

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

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

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

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实际上是基类或接口,或者该类型的对象很大,并且该接口旨在避免大量复制或其他操作。 我建议不要复制对象,也不要像接口所建议的那样将它们存储为共享指针,除非您实际上知道需要复制。

既然您提到了增强功能,那么让我向您展示一些增强范围糖。

link->getgeometries() | adaptors::indirected

这将导致包含Geometry&元素的范围。 copy_range填充列表:

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

观看完整的演示:

生活在Coliru

#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/make_shared.hpp>
#include <iostream>

namespace KinBody {

    struct Link {
        struct Geometry {};

        std::vector<boost::shared_ptr<Geometry> > GetGeometries() const {
            return {};
        }
    };
}

int main() {
    using namespace boost;
    using namespace KinBody;

    auto link = make_shared<Link>();
    auto geometries = boost::copy_range<std::list<Link::Geometry>>(
            link->GetGeometries() | adaptors::indirected
        );
}

线

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM