STL其他内容解析:关于C++中STL的理解和应用


作用:

std map是STL的一个关联容器,map中的元素是关键字----值的对(key--value):关键字起到索引的作用,值则表示与索引相关联的数据。每个关键字只能在map中出现一次。STL的map底层是用红黑树实现的,查找时间复杂度是log(n);

常用函数:

     begin()         返回指向map头部的迭代器
     clear()        删除所有元素
     count()         返回指定元素出现的次数
     empty()         如果map为空则返回true
     end()           返回指向map末尾的迭代器
     equal_range()   返回特殊条目的迭代器对
     erase()         删除一个元素,参数可以是迭代器,可以是关键字
     find()          查找一个元素,返回迭代器
     get_allocator() 返回map的配置器
     insert()        插入元素,插入pair
     key_comp()      返回比较元素key的函数
     lower_bound()   返回键值>=给定元素的第一个位置
     max_size()      返回可以容纳的最大元素个数
     rbegin()        返回一个指向map尾部的逆向迭代器
     rend()          返回一个指向map头部的逆向迭代器
     size()          返回map中元素的个数
     swap()           交换两个map
     upper_bound()    返回键值>给定元素的第一个位置
     value_comp()     返回比较元素value的函数

代码示例:

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

using namespace std;

int main(){  
    map<string,int> s;   //map定义 
    map<string,int>::iterator it;   //迭代器 
     
    //插入元素的三种方法 
    s.insert(make_pair("Amey",99));
    s.insert(pair<string,int>("Maroon",100));
    s["Tom"]=88;
    
    //查找的两种方法 count和find 
    cout<<s.count("Tom")<<endl;  
    it=s.find("Thm");
	if (it==s.end()) cout<<"No"<<endl;
		else cout<<it->first<<"  "<<it->second<<endl;
	
    //删除的两种方法	
    s.erase("Tom");
    it=s.find("Amey");
    s.erase(it);

    //迭代器遍历方法 
    for(it=s.begin(); it!= s.end(); it++){ 
        cout<<it->first<<"  "<<it->second<<endl;
    }
}

插入:

用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入不了的数据,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值。

查找:

用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了。

用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。传入的参数是要查找的key。

自定义map:

1.从大到小的顺序。

    map<string,int, greater<string> > s;   //map定义 
    map<string,int, greater<string> >::iterator it;   //迭代器 

2.结构体Map

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

using namespace std;

struct sdu{
	int math,chi,sin;
};

int main(){  
    map<string,sdu > s;   //map定义 
    map<string,sdu >::iterator it;   //迭代器 
     
    sdu a;  a.math=100;  a.chi=98;  a.sin=20;
    
    s.insert(make_pair("Amey",a));
    //s.insert(pair<string,int>("Maroon",100));
    s["Tom"].math=88; s["Tom"].chi=100; s["Tom"].sin=85;
    
   	//迭代器遍历方法 
    for(it=s.begin(); it!= s.end(); it++){ 
        cout<<it->first<<" "<<s[it->first].math<<" "<<s[it->first].chi<<" "<<s[it->first].sin<<endl;
    }
}

3.重载小于操作符

#include <map>
#include <iostream>

using namespace std;

struct  sdu{
	int x;
	int y;
	bool operator < (const sdu &o) const{ 
		return x < o.x || y < o.y;
	}
};
 
int main(){ 
	map<sdu,string> s;
	sdu a={ 1, 2 };  s[a] = "abc";
	a={ 6, 5 };  s[a] = "ss";
	a={ 4, 100 };  s[a] = "pp";
	map<sdu, string>::iterator it;
	for (it = s.begin(); it != s.end();it++){
		cout << it->first.x << " " << it->first.y << " " << it->second << std::endl;
	}
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐