C++ STL---map总结

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main()
{
	map <int,string> mymap;
/*三种插入数据的方式*/
	mymap.insert(pair<int,string> (1,"student_one"));
	mymap.insert(map<int,string>::value_type(2,"student two"));
	mymap[3]="student_three";
	mymap[4]="student_four";			
	mymap[5]="student_five";
	mymap[6]="student_six";
/*insert 不能重复插入,但是数组方式就会直接覆盖*/
	pair<map<int,string>::iterator,bool> res;
	res=mymap.insert(map<int,string>::value_type(2,"student two2"));
	if(res.second==true)
		cout<<"insert successfully"<<endl;
	else cout<<"insert fail"<<endl;

/*遍历reservase*/
    map<int, string>::iterator iter;  //method 1
    for(iter = mymap.begin(); iter != mymap.end(); iter++)  
       cout<<iter->first<<' '<<iter->second<<endl;  
	for(int i=1;i<=mymap.size();i++)//method 2  这里的int方式的下标一定注意
		cout<<i<<" "<<mymap[i]<<endl;

/*查找
这里给出三种数据查找方法
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,
分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.*/
 	if(mymap.count(1))		//method 1
		cout<<"find 1"<<endl;

	iter = mymap.find(1);   //method 2
    if(iter != mymap.end())  
       cout<<"Find, the value is "<<iter->second<<endl;  
    else  
       cout<<"Do not Find"<<endl; 

	/*第三种:这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解
	https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html  */
/*删除
移除某个map中某个条目用erase()
该成员方法的定义如下:
(1)	iterator  erase (const_iterator position);//通过一个条目对象删除
(2)	size_type erase (const key_type& k);//通过关键字删除---删除成功返回1,否则0
(3)	iterator  erase (const_iterator first, const_iterator last);//删除一个范围---左闭右开

clear()就相当于enumMap.erase(enumMap.begin(),enumMap.end());*/
	iter = mymap.find(1);   //method 2
	iter=mymap.erase(iter);
	cout<<iter->first<<" is "<<iter->second<<endl; 
    int n=mymap.erase(2);
	//cout<<iter->first<<" is "<<iter->second<<endl; 删除了这个元素,指向这个元素的迭代器会失效
	cout<<n<<endl;

	for(iter=mymap.begin();iter!=mymap.end();){
		if(iter->second=="student_five")
/*该方法中利用了后缀++的特点,这个时候执行mapInt.erase(it++);这条语句分为三个过程 
1、先把it的值赋值给一个临时变量做为传递给erase的参数变量
2、因为参数处理优先于函数调用,所以接下来执行了it++操作,也就是it现在已经指向了下一个地址。
3、再调用erase函数,释放掉第一步中保存的要删除的it的值的临时变量所指的位置。 
https://blog.csdn.net/liuzhi67/article/details/50950843 */
			mymap.erase(iter++);
		else
			iter++;
	}

	return 0;
}


map中的swap用法

 

map中的swap不是一个容器中的元素交换,而是两个容器所有元素的交换。

 

排序 ·  map中的sort问题

map中的元素是自动按Key升序排序,所以不能对map用sort函数;

这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int 型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过 不去,下面给出两个方法解决这个问题。

第一种:小于号重载,程序举例。

#include <iostream>
#include <string>
#include <map>
using namespace std;
 
typedef struct tagStudentinfo
 
{
 
       int      niD;
 
       string   strName;
 
       bool operator < (tagStudentinfo const& _A) const
 
       {     //这个函数指定排序策略,按niD排序,如果niD相等的话,按strName排序
 
            if(niD < _A.niD) return true;
 
            if(niD == _A.niD)
 
                return strName.compare(_A.strName) < 0;
 
        return false;
 
       }
 
}Studentinfo, *PStudentinfo; //学生信息
 
int main()
 
{
 
    int nSize;   //用学生信息映射分数
 
    map<Studentinfo, int>mapStudent;
 
    map<Studentinfo, int>::iterator iter;
 
    Studentinfo studentinfo;
 
    studentinfo.niD = 1;
 
    studentinfo.strName = "student_one";
 
    mapStudent.insert(pair<Studentinfo, int>(studentinfo, 90));
 
    studentinfo.niD = 2;
 
    studentinfo.strName = "student_two";
 
    mapStudent.insert(pair<Studentinfo, int>(studentinfo, 80));
 
    for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
 
        cout<<iter->first.niD<<' '<<iter->first.strName<<' '<<iter->second<<endl;
 
    return 0;
}

第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明

 
//第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明
 
#include <iostream>
 
#include <map>
 
#include <string>
 
using namespace std;
 
typedef struct tagStudentinfo
 
{
 
       int      niD;
 
       string   strName;
 
}Studentinfo, *PStudentinfo; //学生信息
 
class sort
 
{
 
public:
 
    bool operator() (Studentinfo const &_A, Studentinfo const &_B) const
 
    {
 
        if(_A.niD < _B.niD)
 
            return true;
 
        if(_A.niD == _B.niD)
 
            return _A.strName.compare(_B.strName) < 0;
 
    return false;
 
    }
};
 
int main()
 
{   //用学生信息映射分数
 
    map<Studentinfo, int, sort>mapStudent;
 
    map<Studentinfo, int>::iterator iter;
 
    Studentinfo studentinfo;
 
    studentinfo.niD = 1;
 
    studentinfo.strName = "student_one";
 
    mapStudent.insert(pair<Studentinfo, int>(studentinfo, 90));
 
    studentinfo.niD = 2;
 
    studentinfo.strName = "student_two";
 
    mapStudent.insert(pair<Studentinfo, int>(studentinfo, 80));
 
    for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
 
        cout<<iter->first.niD<<' '<<iter->first.strName<<' '<<iter->second<<endl;
}


还要说明的是,map中由于它内部有序,由红黑树保证,因此很多函数执行的时间复杂度都是log2N的,如果用map函数可以实现的功能,而STL Algorithm也可以完成该功能,建议用map自带函数,效率高一些。

下面说下,map在空间上的特性,否则,估计你用起来会有时候表现的比较郁闷,由于map的每个数据对应红黑树上的一个节点,这个节点在不保存你的 数据时,是占用16个字节的,一个父节点指针,左右孩子指针,还有一个枚举值(标示红黑的,相当于平衡二叉树中的平衡因子),我想大家应该知道,这些地方 很费内存了吧,不说了……


12、   

      map的基本操作函数:

     C++ maps是一种关联式容器,包含“关键字/值”对

     begin()         返回指向map头部的迭代器

     clear()        删除所有元素

     count()         返回指定元素出现的次数

     empty()         如果map为空则返回true

     end()           返回指向map末尾的迭代器

     equal_range()   返回特殊条目的迭代器对

     erase()         删除一个元素

     find()          查找一个元素

     get_allocator() 返回map的配置器

     insert()        插入元素

     key_comp()      返回比较元素key的函数

     lower_bound()   返回键值>=给定元素的第一个位置

     max_size()      返回可以容纳的最大元素个数

     rbegin()        返回一个指向map尾部的逆向迭代器

     rend()          返回一个指向map头部的逆向迭代器

     size()          返回map中元素的个数

     swap()           交换两个map

     upper_bound()    返回键值>给定元素的第一个位置

     value_comp()     返回比较元素value的函数


很多地方转载自:

https://blog.csdn.net/shawn_hou/article/details/38035577#

还要说明的是,map中由于它内部有序,由红黑树保证,因此很多函数执行的时间复杂度都是log2N的,如果用map函数可以实现的功能,而STL Algorithm也可以完成该功能,建议用map自带函数,效率高一些。

下面说下,map在空间上的特性,否则,估计你用起来会有时候表现的比较郁闷,由于map的每个数据对应红黑树上的一个节点,这个节点在不保存你的 数据时,是占用16个字节的,一个父节点指针,左右孩子指针,还有一个枚举值(标示红黑的,相当于平衡二叉树中的平衡因子),我想大家应该知道,这些地方 很费内存了吧,不说了……


12、   

      map的基本操作函数:

     C++ maps是一种关联式容器,包含“关键字/值”对

     begin()         返回指向map头部的迭代器

     clear()        删除所有元素

     count()         返回指定元素出现的次数

     empty()         如果map为空则返回true

     end()           返回指向map末尾的迭代器

     equal_range()   返回特殊条目的迭代器对

     erase()         删除一个元素

     find()          查找一个元素

     get_allocator() 返回map的配置器

     insert()        插入元素

     key_comp()      返回比较元素key的函数

     lower_bound()   返回键值>=给定元素的第一个位置

     max_size()      返回可以容纳的最大元素个数

     rbegin()        返回一个指向map尾部的逆向迭代器

     rend()          返回一个指向map头部的逆向迭代器

     size()          返回map中元素的个数

     swap()           交换两个map

     upper_bound()    返回键值>给定元素的第一个位置

     value_comp()     返回比较元素value的函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值