C++容器中元素刪除的方法技巧分享
刪除特定值的所有對象
1. 連續(xù)內(nèi)存容器(vector, string, deque)
對于連續(xù)內(nèi)存容器,推薦使用erase-remove習(xí)慣用法【1†source】【5†source】:
c.erase(remove(c.begin(), c.end(), 1963), c.end());
這里remove操作并不會真正移除元素,而是將后面的元素覆蓋要刪除的元素,并返回新區(qū)間的邏輯終點。隨后erase負(fù)責(zé)刪除兩個迭代器之間的元素。
2. 鏈表容器(list)
對于list容器,直接使用成員函數(shù)remove更為高效【1†source】:
c.remove(1963);
3. 標(biāo)準(zhǔn)關(guān)聯(lián)容器(set, multiset, map, multimap)
關(guān)聯(lián)容器應(yīng)使用其erase成員函數(shù)【5†source】:
c.erase(1963); // 對數(shù)時間復(fù)雜度,比序列容器更高效
刪除滿足特定條件的對象
1. 序列容器(vector, string, deque, list)
使用erase-remove_if習(xí)慣用法【1†source】:
c.erase(remove_if(c.begin(), c.end(), badValue), c.end());
對于list,直接使用成員函數(shù):
c.remove_if(badValue);
2. 標(biāo)準(zhǔn)關(guān)聯(lián)容器
有兩種解決方案【5†source】:
方案一:使用remove_copy_if和swap
AssocContainer<int> goodValues;
remove_copy_if(c.begin(), c.end(),
inserter(goodValues, goodValues.end()),
badValue);
c.swap(goodValues);
方案二:使用迭代器循環(huán)刪除
for(auto i = c.begin(); i != c.end(); /* 無操作 */)
if(badValue(*i))
c.erase(i++); // 后綴遞增確保安全
else
++i;
循環(huán)內(nèi)執(zhí)行額外操作時的刪除
1. 序列容器
利用erase的返回值更新迭代器【1†source】:
for(auto i = c.begin(); i != c.end(); )
if(badValue(*i)) {
logFile << "Erasing " << *i << '\n';
i = c.erase(i); // erase返回下一個有效迭代器
} else {
++i;
}
2. 關(guān)聯(lián)容器
使用后綴遞增確保迭代器有效性【5†source】:
for(auto i = c.begin(); i != c.end(); /* 無操作 */)
if(badValue(*i)) {
logFile << "Erasing " << *i << '\n';
c.erase(i++); // 先遞增再刪除
} else {
++i;
}
總結(jié)
選擇正確的刪除方法需要考慮容器類型和刪除條件【1†source】【5†source】:
特定值刪除:
- 序列容器:
erase-remove - list:
remove - 關(guān)聯(lián)容器:
erase
條件刪除:
- 序列容器:
erase-remove_if - list:
remove_if - 關(guān)聯(lián)容器:循環(huán)刪除或
remove_copy_if+swap
循環(huán)內(nèi)額外操作:
- 序列容器:利用
erase返回值 - 關(guān)聯(lián)容器:后綴遞增迭代器
掌握這些技巧可以顯著提高C++程序的效率和安全性,是每個C++開發(fā)者必備的技能。
到此這篇關(guān)于C++容器中元素刪除的方法技巧分享的文章就介紹到這了,更多相關(guān)C++容器元素刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中使用fopen()打開和操作文件的詳細(xì)方法指南
fopen是C語言庫函數(shù),open是系統(tǒng)調(diào)用,mmap是將大文件映射到內(nèi)存中使用,這篇文章主要給大家介紹了關(guān)于C語言中使用fopen()打開和操作文件的詳細(xì)方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
C語言中sizeof()與strlen()的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于C語言中sizeof()與strlen()區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載詳解
這篇文章主要為大家詳細(xì)介紹了C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

