【问题标题】: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 );(或将元素从向量“复制”到向量时的等效项)。

标签: c++


【解决方案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 );
  • 工作伙伴,你是最棒的
猜你喜欢
  • 2016-07-08
  • 2021-01-23
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多