vector删除操作 erase方法注意事项

vector使用十分方便,可以存放任意类型数据结构。有时候我们会在vector中存放对象指针等,在删除某个元素的时候,我们还需要释放相应的内存。

本文主要谈一下erase方法,尤其是在循环体中使用erase方法,需要注意是否存在隐性问题。

erase的函数原型有两种形式:

iterator erase(iterator position);
iterator erase(iterator first, iterator last);

例如有一个类A,

class A
{
public:
    int id;
    A(void);
    ~A(void);
};

定义vector<A*> vec

for (int i=0; i<10; i++)
{
    A *p = new A();
    p->id = i;
    vec.push_back(p);
}

下面要删除vec中id为5的元素:

for(vector<A*>::iterator iter=vec.begin(); iter!=vec.end(); iter++)
{
    if(5 == (*iter)->id)
    {
        delete *iter;
        veci.erase(iter);
    }
}

初看这段代码没什么问题,实际上其中存在很大的问题;当调用erase方法后,iter就变成了一个野指针,继续循环iter++就出错了。

那我们继续修改代码:

for(vector<A*>::iterator iter=vec.begin(); iter!=vec.end(); iter++)
{
    if(5 == (*iter)->id)
   {
        delete *iter;
        iter = veci.erase(iter);
    }
}

erase返回值是这样的:An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists

仔细阅读上面的代码实际上也有问题,首先代码不能删除连续两个为5的元素,因为删除第一个之后,iter指向第二个,自增后,就指向了第二个后面了;其次如果元素5位于vector最后,删除后iter自增也会出错。

那么正确的写法可以如下:

for(vector<A*>::iterator iter=vec.begin(); iter!=vec.end(); )
{
    if(5 == (*iter)->id)
   {
        delete *iter;
        iter = veci.erase(iter);
    }
    else
    {
        iter++;
    }
}

这样就可以解决连续两个相同元素的问题,同时将要删除的元素位于最后的话,也不会有问题,因为删除后,erase返回vector.end()。

时间: 2024-10-06 02:54:01

vector删除操作 erase方法注意事项的相关文章

vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性. erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); vector<int> veci;veci.push_

实习小白::(转) vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性. erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); vector<int> veci; veci.push

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position); //删除指定元素 iterator erase (iterator first, iterator last); //删除指定范围内的元素 返回值:指向删除元素(或

STL中用erase()方法遍历删除元素?.xml

pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9;font-style:italic;font-weight:bold;} .selfFuc{color:#f1f9be;} .bool{color:#69305e;} .condition{color:#628698;font-weight:bold;} .key{color:#e336b6;} .

js添加确认删除操作注意事项

1 function delsure(){ 2 if(confirm('确认删除吗?')){ 3 return true;//点击确定则返回这里的内容 4 }else{ 5 return false; 6 } 7 } 在表单中添加onsubmit="return delsure(this)", confirm("确认删除吗?")如果点确定返回true,点取消返回false,必须要添加return true和return false,不然不起作用! js添加确认删除操

vector遍历删除特定项目和遍历删除所有项目方法

1 #include <iostream> 2 #include <vector> 3 #include <string> 4 5 using namespace std; 6 7 int main(void) 8 { 9 vector<string> vecStr; 10 vecStr.push_back("aaa"); 11 vecStr.push_back("bbb"); 12 vecStr.push_back(

NSTableView 表格操作:增加,删除,编辑(方法2)

NSTableView 表格操作:增加,删除,编辑(方法2) 在: NSWindowController 新建表单 (H,M,XIB三个文件+新建一个类放CellData) 1.不使用delegate 2.数据源直接是当前文件File's Owner 3.H继承NSTableView协议,将需要的几个函数放入 4.增加一个列表数据单元类 这个方法的特点是: 当新建立一个窗体,显示一个表格内容,不使用Deleget就少了一个类的2个文件,让程序简单化 操作步骤: STEP1 将NSTableVie

STL中慎重选择删除元素的方法

 一.要删除容器中有特定值的所有对象 1.如果容器是vector.string或deque,则使用erase-remove习惯用法.例如: vector<int> c; c.erase(remove(c.begin(),c.end(),1963),c.end());//删除值是1963的元素 下面讲一下算法remove: template<classForwardIterator,class T> ForwardIteratorremove(ForwardIterator fi

vector删,erase和remove难怪--【STL】

供vector使用容器.通常只是一个简单的遍历查找,其他操作已执行,这不是,今天,稍有不慎. erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个: 如对数据1 6 6 4 7; #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> vec; vec.push_back(1); vec.pu