c ++如何在内部循环中使用带有自动的矢量擦除对象
c++ How to erase object using vector with auto while inside loop
嗨,stackoverflow的伙计们,
我一直想知道是否有任何简单的方法:迭代器控制的远程 for 循环,以便在访问容器时正确擦除其容器中的对象; 使用自动它。
对于标准的索引控制 for 循环,我会做这样的事情:
void del(int i){
cout<<"Deleting: "<<myObjects[i]<<':'<<myObjects[i]->c<<endl;
for(unsigned int j = 0; j < allObjects.size();){
if(allObjects[j] == myObjects[i]){
delete allObjects[j];
allObjects[j] = 0;
allObjects.erase(allObjects.begin()+j);
break;//Found and deleted first instance, escaping for-loop.
}else{
++j;
}
}
myObjects[i]=0;
myObjects.erase(myObjects.begin()+i);
}
自动 for 循环如下所示:
void del(int i){
cout<<myObjects[i]<<endl;
for(auto it: allObjects)
if(it == myObjects[i]){
delete it;
it = 0;
//allObjects.erase();// Found, needs erasing.
}
myObjects[i]=0;
myObjects.erase(myObjects.begin()+i);
}
我一直无法正确解决这个问题,并且一直在诉诸老式索引(使用索引可以做到这一点的许多方法)。
我可以删除它,并将其设置为 0,但是我如何在不知道索引的情况下从矢量中擦除它,并可能在矢量中擦除它?我知道我可以跟踪循环并使用计数器执行此操作,但这会破坏使用漂亮干净的迭代器循环的目的。
如果不在向量中删除,除了重新访问向量之外,我以后将如何以轻松的方式进行操作?
使用索引驱动的for循环没有错,只是想知道是否有一个简单的替代方法使用我们的新朋友"auto it"。
谢谢。
很
抱歉,但是没有办法使用基于范围的 for 循环来擦除。您应该使用标准方式:
for(auto it = allObjects.begin(); it != allObjects.end();)
{
if(/* condition */)
it = allObjects.erase(it);
else
++it;
}
另请参阅此处的热门答案: 我们可以擦除 c++11 中基于范围的 for 循环中的项目吗
与其滚动自己的循环,不如(并且应该)使用标准库:
allObjects.erase( std::remove(myObjects.begin(), myObjects.end, myObjects[i]),
allObjects.end() );
这更有效,因为您的算法是 O(n^2),因为元素一直在移动,并且更具可读性。
在您的情况下,由于您存储了指针,因此必须先删除"已删除的对象":
auto r = std::remove(myObjects.begin(), myObjects.end, myObjects[i]);
for(auto i=r; i != allObjects.end(); ++i) {
delete *i;
}
allObjects.erase(r, allObjects.end());
如果你使用智能指针(std:unique_ptr
或std::shared_ptr
),这会更简单,因为你可以跳过手动循环,只使用常见的单行。
objects.erase(
std::remove_if(
objects.begin(),
objects.end(),
[](const Object &) -> bool {
// Do "some stuff", then return true if element should be removed.
return true;
}
),
objects.end()
);
你也可以使用Boost.Range和Lambda。
相关文章:
- C++ 根据成员函数从矢量中擦除对象
- 擦除矢量问题矢量中的对象
- 如何将某个元素从shared_ptr擦除到对象向量?
- 如何根据某些值擦除/删除类对象的向量
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- 擦除矢量中的对象时出错.如何将移动作业运算符添加到我的类中
- 在小对象优化中调试崩溃以进行类型擦除
- 从向量中擦除 opencv 矩形对象
- 从对象指针的 STD 列表中擦除对象
- c++矢量对象.擦除
- 对象是否可以从标准C++容器中擦除自身
- 在C++中从矢量中擦除对象
- c ++如何在内部循环中使用带有自动的矢量擦除对象
- 无法删除和擦除矢量上的对象指针
- 从矢量中擦除对象的特定实例
- 对象的 C++ 向量,包含动态分配的内存 - "擦除"不起作用
- 从 std::map 擦除对象时破坏对象
- 擦除CPP中的重叠对象
- 矢量擦除函数删除错误的对象
- 从基类ptr的vector对象中擦除