- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个方法,用于在 vector
中搜索特定对象(本例中为 Bar
对象)。当我在 vector
中找到该对象 bar 时,我应该将其push_back
到 vector
的末尾。
我有 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]
}
}
}
如何比较条 vector 上的当前迭代与方法参数中对条的引用?
由于我没有使用 for(int i = 0, ...) 我该如何删除我当前所在的位置?
从 vector 中删除条形对象后,如何插入一个来自引用(对 shared_ptr)的新条形对象?
最佳答案
如果你想进行深度比较,那么你现在做的是正确的,但你需要实现operator==(const Bar&, const Bar&)
。如果要进行浅比较,则需要比较对象的地址:if(b.get() == &bar)
您不能在基于范围的循环中删除当前 项目,除非您单独跟踪索引或另一个迭代器。在这种情况下,基于范围的循环根本没有用。
指向对象的共享指针在变量 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/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!