C++如何刪除map容器中指定值的元素詳解
前言
大家都知道m(xù)ap容器是C++ STL中的重要一員,平時(shí)會(huì)遇到刪除map容器中value為指定元素的問(wèn)題,例如刪除所有字符串為"123"或者能整除3的元素。
一、map容器下的方法說(shuō)明
由于map容器下的方法較多,這里只列舉代碼中用到的幾個(gè)方法:
insert()方法:
//插入val到pos的后面,然后返回一個(gè)指向這個(gè)元素的迭代器 iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val ); //插入start到end的元素到map中 void insert( input_iterator start, input_iterator end ); //只有在val不存在時(shí)插入val。返回值是一個(gè)指向被插入元素的迭代器和一個(gè)描述是否插入的bool值 pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );
erase()方法:
//erase()函數(shù)刪除在pos位置的元素,或者刪除在start和end之間的元素,或者刪除那些值為key的所有元素 void erase( iterator pos ); void erase( iterator start, iterator end ); size_type erase( const KEY_TYPE &key );
iterator迭代器。
二、刪除map容器中指定的字符串
下面代碼中map容器的value對(duì)應(yīng)的是一個(gè)string類型的指針,在初始化時(shí)類似于string *p = new string("123"); 。
/**
* @FileName map_del_str.cpp
* @Describe A simple example for deleting an element of string in map.
* @Author vfhky 2016-06-26 10:26 https://typecodes.com/cseries/mapdelintstring.html
* @Compile g++ map_del_str.cpp -o map_del_str
* @Reference
*/
#include <iostream>
#include <map>
using namespace std;
#define TOTAL 10
#define DEL_STR "123"
/**
* 刪除map中所有元素為str的數(shù)據(jù)
*/
void fun( map<int, string *> &map1, const string str )
{
map<int, string *>::iterator it;
int i_Total = 0;
for( it=map1.begin(); it!=map1.end(); )
{
if( *(it->second) == str )
{
/**
* 123 123 123 123 123 123 123 123 123 123
*/
cout << *(it->second) << " ";
//一定要先釋放內(nèi)存的控制
delete it->second;
it->second = NULL;
//再刪除迭代
map1.erase(it++);
++i_Total;
}
else
{
it++;
}
}
//i_Total=[10]
cout << endl << "i_Total=[" << i_Total << "]" << endl;
}
int main( int argc, char **argv )
{
map<int, string *> map1;
//初始化map1
for( int i=0; i<TOTAL; i++ )
{
map1.insert( pair<int, string *>(i,new string("123")) );
//map1[i] = new string("123");
}
//刪除為DEL_STR的元素
fun( map1, DEL_STR );
//查看最后的數(shù)據(jù)
map<int, string *>::iterator it1;
for( it1=map1.begin(); it1!=map1.end(); ++it1 )
{
cout << "map1[" << it1->first << "]=[" << *(it1->second) << "]" << endl;
}
return 0;
}
效果如下圖所示:

三、刪除map容器中指定的整型數(shù)據(jù)
下面代碼中map容器的value對(duì)應(yīng)的是一個(gè)int數(shù)據(jù),在初始化時(shí)可以直接使用map1[i] = i語(yǔ)句。
/**
* @FileName map_del_int.cpp
* @Describe A simple example for deleting an element of interger in map.
* @Author vfhky 2016-06-26 10:26 https://typecodes.com/cseries/mapdelintstring.html
* @Compile g++ map_del_int.cpp -o map_del_int
* @Reference
*/
#include <iostream>
#include <map>
using namespace std;
#define TOTAL 100
#define DEL_INT 3
/**
* 刪除map中所有值整除NUM的元素
*/
void fun( map<int,int> &map1, const int NUM )
{
map<int, int>::iterator it;
int i_Total = 0;
for( it=map1.begin(); it!=map1.end(); )
{
if( it->second % NUM == 0 )
{
/**
* 0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
*/
cout << it->second << " ";
map1.erase(it++);
++i_Total;
}
else
{
it++;
}
}
cout << endl << "i_Total=[" << i_Total << "]" << endl;
}
int main( int argc, char **argv )
{
map<int, int> map1;
//初始化map1
for( int i=0; i<TOTAL; i++ )
{
map1.insert(pair<int, int>(i,i));
//map1[i] = i;
}
//刪除整除3的元素
fun( map1, DEL_INT );
//查看最后的數(shù)據(jù)
map<int, int>::iterator it1;
for( it1=map1.begin(); it1!=map1.end(); ++it1 )
{
cout << "map1[" << it1->first << "]=[" << it1->second << "]" << endl;
}
return 0;
}
效果如下圖所示:

四、附錄
STL容器分順序容器Sequence Container(包含vector,deque,list容器)和關(guān)聯(lián)容器Associative Container(包含set,multiset,map,multimap容器)。C++標(biāo)準(zhǔn)中,Sequence Container的erase函數(shù)會(huì)返回iterator,但Associative Container不返回iterator。所以在小節(jié)2、小節(jié)3中使用map1.erase(it++)而不是直接map1.erase(it) 。
五、總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
C語(yǔ)言棧的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言棧的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07
c++中cin/cout與scanf/printf的區(qū)別比較
這篇文章主要介紹了c++中cin/cout與scanf/printf的區(qū)別比較,需要的朋友可以參考下2017-06-06
C語(yǔ)言用fun函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換方式
這篇文章主要介紹了C語(yǔ)言用fun函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
C++程序自動(dòng)重啟的實(shí)現(xiàn)代碼
自動(dòng)重啟原理很簡(jiǎn)單,用一個(gè)進(jìn)程監(jiān)控另一個(gè)進(jìn)程,掛了就再啟動(dòng)一個(gè),細(xì)節(jié)也不算多,主要是正確判斷進(jìn)程狀態(tài)和啟動(dòng)方式,本文就給大家講講C++程序自動(dòng)重啟的實(shí)現(xiàn)方法,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-04-04
C++實(shí)現(xiàn)list增刪查改模擬的示例代碼
本文主要介紹了C++實(shí)現(xiàn)list增刪查改模擬,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
一文帶你學(xué)習(xí)C++析構(gòu)函數(shù)
在C++中,析構(gòu)函數(shù)是一種特殊類型的成員函數(shù),用于在對(duì)象生命周期結(jié)束時(shí)被自動(dòng)調(diào)用,本文我們將介紹C++析構(gòu)函數(shù)的一些重要知識(shí)點(diǎn),并提供相應(yīng)代碼示例,需要的朋友可以參考下2023-05-05

