将项目从一个向量复制到另一个向量

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&lt;A&gt; a = ...; 并且想要复制一个 A 的新实例,请使用 auto b = std::make_shared&lt; A &gt;( *a );(或将元素从向量“复制”到向量时的等效项)。 【参考方案1】:

如果您想要从原始向量复制的新实例,您可以使用:

for ( const auto& e : listEnvironmentStatic )
    listEnvironment.push_back( std::make_shared<Environment>( *e ) );

【讨论】:

如果 Environment 是一个抽象基类呢? @nilo 在这种情况下,您需要将一些方法 clone() 添加到可以提供副本的类及其派生类中。每个(大多数派生的)类都知道如何创建自己的副本(使用std::make_shared&lt;D&gt;(*this);)并从clone() 返回共享指针。然后使用listEnvironment.push_back( e-&gt;clone() ); 所以基本上添加一个虚拟 std::shared_ptr Clone() = 0;然后做 std::shared_ptr Clone() return std::make_shared(*this); ? @nilo 差不多,只是你需要std::make_shared&lt; DerivedFromEnvironment &gt;( *this ); 中的派生类名称。或者只是std::make_shared&lt; typename std::decay&lt;decltype(*this)&gt;::type &gt;( *this ); 工作伙伴,你是最棒的

以上是关于将项目从一个向量复制到另一个向量的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个向量复制到另一个向量的末尾? [复制]

以相反的顺序将一个向量复制到另一个向量

将类成员向量的内容复制到另一个向量中,然后将它们交换回来

如何在 C++ 中将两个向量复制到另一个向量

将矢量引用复制到另一个

C++ 将对象向量中的元素复制到具有此元素的向量中