map/multimap基本概念
Map的特性是,所有元素都會根據元素的鍵值自動排序。Map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值 我們可以通過map的i迭代器改變mao的鍵值嗎?答案是不行,因為map的鍵值關系到map元素的排列規則,任意改變map鍵值會嚴重破壞map的組織,如果想要修改元素的實值,是可以的 Map和list擁有相同的某些性質,當對它的容器元素進行新增操作或者刪除操作時,操作之前的所有迭代器,在操作完成之后依然有效,當然被刪除的那個元素的迭代器必然是個例外 Multimap和map的操作類似,唯一區別multimap的鍵值可以重復 map和multimap都是以紅黑樹為底層實現機制
map 對象的拷貝構造與賦值
map(constmap&mp); //拷貝構造函數 map&operator=(constmap&mp); //重載等號操作符 map.swap(mp); //交換兩個集合容器
map 的大小操作
map.size();//返回容器中元素的數目 map.empty();//判斷容器是否為空
map 的刪除操作
map.clear(); //刪除所有元素 ? map.erase(pos);//刪除 pos 迭代器所指的元素,返回下一個元素的迭代器。 map.erase(beg,end); //刪除區間[beg,end)的所有元素 ,返回下一個元素的迭代器。 map.erase(keyElem); //刪除容器中 key 為 keyElem 的對組。
void test02 ( ) { map< int , int > m; m. insert ( pair< int , int > ( 1 , 10 ) ) ; m. insert ( make_pair ( 2 , 20 ) ) ; m. insert ( map< int , int > :: value_type ( 3 , 30 ) ) ; m[ 4 ] = 40 ; m. erase ( 1 ) ; for ( map< int , int > :: iterator it = m. begin ( ) ; it != m. end ( ) ; it++ ) { cout << "key=" << it- > first << "value" << it- > second << endl; } map< int , int > :: iterator pos= m. find ( 2 ) ; if ( pos != m. end ( ) ) { cout << "找到,key值為:" << pos- > first << "value" << pos- > second << endl; } else { cout << "未找到" << endl; } int num= m. count ( 3 ) ; cout << "num=" << num << endl; map< int , int > :: iterator ret = m. lower_bound ( 3 ) ; if ( ret != m. end ( ) ) { cout << "lower_bound中key" << ret- > first << "value" << ret- > second << endl; } else { cout << "未找到" << endl; } ret = m. upper_bound ( 3 ) ; if ( ret != m. end ( ) ) { cout << "upper_bound中key" << ret- > first << "value" << ret- > second << endl; } else { cout << "未找到" << endl; } pair< map< int , int > :: iterator, map< int , int > :: iterator> ret2= m. equal_range ( 3 ) ; if ( ret2. first != m. end ( ) ) { cout << "找到了equal_range中的lower_bound的key" << ret2. first- > first << "value" << ret2. first- > second << endl; } else { cout << "未找到" << endl; } if ( ret2. second != m. end ( ) ) { cout << "找到了equal_range中的upper_bound的key" << ret2. second- > first << "value" << ret2. second- > second << endl; } else { cout << "未找到" << endl; } }
map 的查找操作
map.find(key); 查找鍵 key 是否存在,若存在,返回該鍵的元素的迭代器;若不存 在,返回 map.end(); map.count(keyElem); //返回容器中 key 為 keyElem 的對組個數。對 map 來說,要 么是 0,要么是 1。對 multimap 來說,值可能大于 1。
map 的插入與迭代器
map.insert(…); //往容器插入元素,返回 pair<iterator,bool> 在 map 中插入元素的三種方式: 假設 map<int,string>mapStu; 通過 pair 的方式插入對象 mapStu.insert( pair<int,string>(3,“小張”) ); 通過 pair 的方式插入對象 mapStu.inset(make_pair(-1,“校長-1”)); 通過 value_type 的方式插入對象 mapStu.insert( map<int,string>::value_type(1,“小李”) ); 通過數組的方式插入值 mapStu[3]=“小劉"; mapStu[5]=“小王";
void test01 ( ) { map< int , int > m; m. insert ( pair< int , int > ( 1 , 10 ) ) ; m. insert ( make_pair ( 2 , 20 ) ) ; m. insert ( map< int , int > :: value_type ( 3 , 30 ) ) ; m[ 4 ] = 40 ; for ( map< int , int > :: iterator it = m. begin ( ) ; it != m. end ( ) ; it++ ) { cout << "key=" << it- > first << "value" << it- > second << endl; } if ( m. empty ( ) ) { cout << "空" << endl; } else { cout << "size=" << m. size ( ) << endl; } }
注意
前三種方法,采用的是 insert()方法,該方法返回值為 pair<iterator,bool> 第四種方法非常直觀,但存在一個性能的問題。插入 3 時,先在 mapStu 中查找主 鍵為 3 的項,若沒發現,則將一個鍵為 3,值為初始化值的對組插入到 mapStu 中, 然后再將值修改成“小劉”。若發現已存在 3 這個鍵,則修改這個鍵對應的 value stringstrName=mapStu[2]; //取操作或插入操作 只有當 mapStu 存在 2 這個鍵時才是正確的取操作,否則會自動插入一個實例,鍵 為 2,值為初始化值。
class myCompare { public : bool operator ( ) ( int v1, int v2) { return v1 > v2; } } ; void test03 ( ) { map< int , int , myCompare> m; m. insert ( pair< int , int > ( 1 , 10 ) ) ; m. insert ( make_pair ( 2 , 20 ) ) ; m. insert ( map< int , int > :: value_type ( 3 , 30 ) ) ; m[ 4 ] = 40 ; for ( map< int , int , myCompare> :: iterator it = m. begin ( ) ; it != m. end ( ) ; it++ ) { cout << "key:" << it- > first << "value:" << it- > second << endl; } }