vector map容器刪除操作總結

2021-06-16 14:04:22 字數 3082 閱讀 8587

1、關於vector中元素的刪除和迭代器失效問題

[cpp]view plain

copy

vector<

int> vv;  

vv.push_back(1);                                //加入第乙個元素

vector>::iterator itbegin = vv.begin();   

//獲取第乙個元素迭代器*itbegin=1

vv.push_back(2);                                //因為預留不夠,所以發生記憶體搬移,之前迭代器將全部失效

vv.push_back(1);                                //即是說itbegin現在已經是個無效迭代器

vv.push_back(1);                                //所以使用vector迭代器一定要小心失效!

vv.push_back(3);                                //移動、增加、插入、刪除以及reserve、resize都可能使迭代器無效!

vv.push_back(4);  

vv.push_back(3);  

vv.push_back(5);  

vv.push_back(6);  

intn = vv.size();      

//n = 9

vector>::iterator itrmv = remove(vv.begin(), vv.end(), 3);    

//結果:1,2,1,1,4,5,6,5,6

n = vv.size();          //n = 9

//刪除vector中等於某值的所有元素

//remove演算法只是對容器中有效元素向前移動覆蓋無效元素,返回第乙個無效元素指標

//1、它不會有刪除動作 2、尾部無效元素沒有意義 3、之後容器size不變

vv.erase(itrmv, vv.end());          //結果:1,2,1,1,4,5,6

n = vv.size();                      //n = 7

bool

bedelete(

intn)  

//借助remove_if演算法刪除vecotr中符合某些條件的所有元素

vv.erase(remove_if(vv.begin(), vv.end(), bedelete), vv.end());  //結果:4,5,6

n = vv.size();      //n = 3

//若用迴圈實現刪除,需要注意erase後迭代器失效問題

for(vector<

int>::iterator it=vv.begin(); it!=vv.end(); )  

else

}  n = vv.size();              //n=2,結果:5,6

2、釋放vector容器多餘的記憶體

[cpp]view plain

copy

vector<

int> vn;  

vn.reserve(10);             //預留10個元素空間

intnn = vn.capacity();     

//nn = 10

vn.push_back(1);  

vn.push_back(2);  

nn = vn.capacity();         //nn = 10

vector>(vn).swap(vn); 

//通過建立乙個新物件釋放多餘空間

nn = vn.capacity();         //nn = 2

nn = vn.size();             //nn = 2

vector>().swap(vn);   

//會完全清空容器,釋放所有空間

3、map中刪除滿足某些條件的元素

[cpp]view plain

copy

map<

int, 

int> mm;  

mm.insert(make_pair(1,1));  

mm.insert(make_pair(2,2));  

mm.insert(make_pair(3,1));  

mm.insert(make_pair(4,3));  

mm.insert(make_pair(5,3));  

mm.insert(make_pair(6,6));  

//注意:對map和set等自動排序的容器不應使用remove一類演算法

//應使用for+erase或者while+find_if+erase

//第一種方法for+erase

map, int

>::iterator mit;  

for(mit = mm.begin(); mit != mm.end();)  

else

}                     

//第二種方法,while+find_if+erase

//僅以元素做條件檢索

bool

mbedelete(

const

pair<

int, 

int>& val)  

mit = find_if(mm.begin(), mm.end(), mbedelete);  

while

(mit != mm.end())  

//除元素外還需要傳入另外乙個條件引數

//這裡的引數無法使用常量引用

bool

mbedelete2(pair<

int, 

int> val, 

intn)  

mit = find_if(mm.begin(), mm.end(), bind2nd(ptr_fun(mbedelete2),3));  

while

(mit != mm.end())    

c 容器 vector map 中使用函式指標

我要動態生成mfc選單,動態繫結響應命令。include stdafx.h include include include string using namespace std 宣告乙個函式指標 int pfunc int int func1 int nin int func2 int nin ty...

C vector容器刪除操作

1.vector pop back 刪除vector的最後乙個元素,vector的大小減一,刪了的元素被銷毀。2.vector erase iterator erase iterator position iterator erase iterator first,iterator last 這個刪...

STL中不同容器的刪除操作

說明 1 對於順序容器,如vector deque和string等,刪除操作應該用如下形式 vec.erase remove vec.begin vec.end 5 vec.end 2 對於list,上述1的方法也可以,但是效率的話,應該使用如下形式 alist.remove 3 3 對於關聯容器,...