将项目从一个向量复制到另一个向量
Posted
技术标签:
【中文标题】将项目从一个向量复制到另一个向量【英文标题】:Copy items from one vector to another vector 【发布时间】:2015-05-10 21:06:20 【问题描述】:我正在尝试将某些项目从一个向量复制到另一个包含 shared_ptr 对象的向量中。
我不想要一个引用,而是将该对象的唯一副本放置到另一个向量中。 这样做的重点是用游戏对象填充 listEnvironmentStatic,当游戏地图开始时,所有内容都被复制到 listEnvironment 以进行模拟,当玩家想要重置地图时,listEnvironment 再次从 listEnvironmentStatic 复制所有内容,每个对象都回到它的原来的位置。
this->listEnvironment.insert(this->listEnvironment.end(), this->listEnvironmentStatic.begin(), this->listEnvironmentStatic.end());
使用 std::copy 和调整第二个向量的大小也不起作用。
看下面的例子:
std::vector<std::shared_ptr<Environment>> listEnvironmentStatic;
std::vector<std::shared_ptr<Environment>> listEnvironment;
现在假设我在 listEnvironmentStatic 中有几个项目我想复制到 listEnvironment(它始终包含至少 1 个对象),我将如何进行唯一复制并仍然保留 listEnvironmentStatic 以防玩家想要重新启动再来一张地图?
【问题讨论】:
我认为你不应该在像vectors
这样的容器中使用 shared_ptr
。例如,请参阅 Is using std::vector< std::shared_ptr<const T> > an antipattern? 和 shared_ptr with vector。
您要追加到listEnviroment
还是替换其中的所有内容?
如果list2总是包含一个对象,为什么它是一个向量?
“整个想法是将游戏地图重置回原点。”除非你解释清楚,否则这毫无意义。
你的问题很难理解。如果您有一个 shared_ptr<A> a = ...;
并且想要复制一个 A
的新实例,请使用 auto b = std::make_shared< A >( *a );
(或将元素从向量“复制”到向量时的等效项)。
【参考方案1】:
如果您想要从原始向量复制的新实例,您可以使用:
for ( const auto& e : listEnvironmentStatic )
listEnvironment.push_back( std::make_shared<Environment>( *e ) );
【讨论】:
如果 Environment 是一个抽象基类呢? @nilo 在这种情况下,您需要将一些方法clone()
添加到可以提供副本的类及其派生类中。每个(大多数派生的)类都知道如何创建自己的副本(使用std::make_shared<D>(*this);
)并从clone()
返回共享指针。然后使用listEnvironment.push_back( e->clone() );
。
所以基本上添加一个虚拟 std::shared_ptrstd::make_shared< DerivedFromEnvironment >( *this );
中的派生类名称。或者只是std::make_shared< typename std::decay<decltype(*this)>::type >( *this );
工作伙伴,你是最棒的以上是关于将项目从一个向量复制到另一个向量的主要内容,如果未能解决你的问题,请参考以下文章