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 對於關聯容器,...