1. 程式人生 > >vector中刪除一個元素

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;
     }
}