在vector中删除一个元素

 

例如:
class classA
{
public:
int e;
}
vector<classA>; class_vector;

如果要删除第三个,似乎只能按着下面这个方式进行
class_vector.erase(&class_vector[2]);
这种方法太麻烦了比如我要删最后一个
class_vector.erase(&class_vector[class_vector.size()-1]);

------------------------------------

>> 如果要删除第三个,似乎只能按着下面这个方式进行
>> class_vector.erase(&class_vector[2]);

&class_vector[2] 的类型是指针,而上述 vector 的 erase 成员函数要求的参数类型是 iterator,两者的类型并不一定兼容,所以你的上述用法对于大多数的编译器来说都是不成立的。

根据 vector 的特点,删除其中间的元素没有什么捷径(不提供按下标删除元素的方法。对于 vector 一般要尽量避免删除中间的元素)。不过,对于删除最后一个元素,vector 提供了非常简洁的方式,并且实现效率也非常高,这就是 pop_back () 操作。

----------------------------------------------

#include <vector>
using namespace std;
void main(void)
{
vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);
array.push_back(5);

vector<int>::iterator itr = array.begin();
while (itr != array.end)
{
if (*itr == 3)array.erase(itr);//删除值为3的元素
++itr;
}
}
//若是最后一个可用array.pop_back()

-------------------

删除所有偶数项,并打印出删除的项
1. vector/queue
正确方法1:
void erase(vector<int> &v)
{
    for(vector<int>::iterator vi=v.begin();vi!=v.end();)
     {
        if(*vi % 2 == 0)
         {
             cout << "Erasing " << *vi << endl;
             vi = v.erase(vi);
         }
        else ++vi;
     }
}

正确方法2:
void erase2(vector<int> &v)
{
    for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
     {
        if(*ri % 2 == 0)
         {
             cout << "Erasing " << *ri << endl;
             v.erase((++ri).base());    //erase()函数期待的是正向iterator,故而这里要调
                                                    //用base()函数将逆向iterator转换为正向的
         }
        else ++ri;
     }
}



2.map/list
正确方法
void erase(map<int,int> &m)
{
    for(map<int,int>::iterator mi=m.begin();mi!=m.end();)
     {
        if(mi->second % 2 == 0)
         {
             cout << "Erasing " << mi->second << endl;
             m.erase(mi++);
         }
        else ++mi;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值