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; } }