如何从shared_ptr向量中的某个位置移除对象并推回到末尾
How to remove an object from a position in a vector of shared_ptr and push back to the end?
我想创建一个方法,在vector
中搜索特定对象(本例为Bar
对象)。当我在vector
中找到那个对象条时,我应该把push_back
那块放到vector
的末尾。
关于这个实施,我有三个问题。。。但我不知道是否有更简单的方法。
这是我的实现:
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]
}
}
}
如何将条向量上的当前迭代与方法参数中对条的引用进行比较?
既然我不使用for(int I=0,…),我该如何擦除我当前所在的位置?
从向量中删除bar对象后,如何插入来自引用(到shared_ptr)的新对象?
-
如果你想做一个深入的比较,那么你现在做得很正确,但你需要实现
operator==(const Bar&, const Bar&)
。如果你想做一个浅层次的比较,那么你需要比较对象的地址:if(b.get() == &bar)
-
除非单独跟踪索引或其他迭代器,否则不能在基于范围的循环中擦除当前项。在这种情况下,基于范围的循环根本没有用处。
-
指向该对象的共享指针位于变量
b
中。只需复制即可。或者,为了更好的性能,移动它。
但我不知道是否有更简单的方法。
有。
首先,您需要为要移动的元素找到一个迭代器。要做到这一点,最简单的方法再次取决于你是想进行肤浅的比较还是深入的比较。为了进行深入比较,可以使用std::find
。您仍然需要定义operator==(const Bar&, const Bar&)
。对于浅层比较,可以将std::find_if
与比较地址的比较函数一起使用。
一旦有了迭代器,如果希望其他元素的顺序保持不变,就可以使用std::rotate
将指向的元素移动到末尾。只需将向量从找到的元素旋转到末尾,即可使下一个元素成为第一个元素。或者,如果顺序在其他方面不相关,那么您可以使用最后一个元素执行std::swap
,这更有效。
编辑:mkaes在评论中提出std::stable_partition
。它也可以工作,不需要单独的find
调用。即使使用深度比较,也需要一个比较函子。它也适用于多场比赛,但这也意味着如果找到一场比赛,它不会提前结束。如果其他元素的顺序不可逆,则可以使用std::partition
。
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 使用迭代器时如何访问对象在向量中的位置?
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 在C++代码中搜索对象的实例化位置
- 在特定内存位置构造 c++ 对象
- delete如何知道对象在内存中的起始位置
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 在C++标准中记录对象的内存布局的哪个位置?
- QT:即使在static_cast后也无法在主窗口中设置对象的位置
- 将光标位置存储在类对象中(ncurses c++)
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 如何在3D世界中获得对象相对于父母的绝对位置
- 如何在C 2D向量中找到对象(而不是int)的位置
- 从文件对象的当前位置删除字符
- 将对象位置与网格对齐
- D3DXVec3项目需要一半的对象位置
- Cocos 2dx 人像模式对象位置混乱
- 如何使用Qt的QGLWidget准确更新OpenGL中的对象位置?
- 运算符重载-如何更改对象位置