gpt4 book ai didi

c++ - 如何从 shared_ptr vector 中的某个位置移除对象并推回末尾?

转载 作者:行者123 更新时间:2023-11-28 00:08:06 30 4
gpt4 key购买 nike

我想创建一个方法,用于在 vector 中搜索特定对象(本例中为 Bar 对象)。当我在 vector 中找到该对象 bar 时,我应该将其push_backvector 的末尾。

我有 3 个关于此实现的问题...但我不知道是否有更简单的方法来执行此操作。

这是我的实现:

std::vector<std::shared_ptr<Bar>> mBarVector;

//(...)

void Foo::pushBack(Bar& bar)
{
for (auto& b : mBarVector)
{
if(*b == bar) // ERROR [1]
{
//mBarVector.erase(?) This position...?! How? [2]

//mBarVector.push_back(bar); ERROR! [3]
}
}
}
  1. 如何比较条 vector 上的当前迭代与方法参数中对条的引用?

  2. 由于我没有使用 for(int i = 0, ...) 我该如何删除我当前所在的位置?

  3. 从 vector 中删除条形对象后,如何插入一个来自引用(对 shared_ptr)的新条形对象?

最佳答案

  1. 如果你想进行深度比较,那么你现在做的是正确的,但你需要实现operator==(const Bar&, const Bar&)。如果要进行浅比较,则需要比较对象的地址:if(b.get() == &bar)

  2. 您不能在基于范围的循环中删除当前 项目,除非您单独跟踪索引或另一个迭代器。在这种情况下,基于范围的循环根本没有用。

  3. 指向对象的共享指针在变量 b 中。简单地复制它。或者,为了提高性能,移动它。

but I don't know if there is an easier way to do this.

有。

首先,您需要找到指向要移动的元素的迭代器。最简单的方法,再次取决于你是想要浅层比较还是深层比较。对于深度比较,您可以使用 std::find。您仍然需要定义 operator==(const Bar&, const Bar&)。对于浅层比较,您可以将 std::find_if 与比较地址的比较仿函数一起使用。

有了迭代器后,如果您希望其他元素的顺序保持不变,则可以使用 std::rotate 将指向的元素移动到末尾。只需将 vector 从找到的元素旋转到末尾,使下一个元素成为第一个元素。或者,如果顺序无关紧要,那么您可以用效率更高的最后一个元素执行 std::swap

编辑:mkaes 在评论中提出了 std::stable_partition。它也可以工作,不需要单独的 find 调用。即使您确实使用深度比较,您也需要一个比较仿函数。它也适用于多场比赛,但这也意味着即使找到一场比赛也不会提前结束。如果其他元素的顺序无关紧要,您可以使用 std::partition

关于c++ - 如何从 shared_ptr vector 中的某个位置移除对象并推回末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34420042/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com