map和multimap映射容器

map容器

map所处理的数据与数据库表具有键值的记录非常相似,在键值与映射数据之间,建立一个数学上的映射关系。map容器的数据结构仍然採用红黑树进行管理。插入的元素键值不同意反复,所使用的结点元素的比較函数仅仅对元素的键值进行比較,元素的各项数据能够通过键值检索出来。对于键值和映射数据。能够通过pair封装成一个结构对象。map要做的就是将这个pair对象插入到红黑树中,同一时候也须要提供一个仅使用键值进行比較的函数对象,将它传递给红黑树。此时就能够利用红黑树的操作将map元素插入到二叉树的正确位置。并对其进行元素的删除和检索。map与set的差别主要在于,map处理的是带有键值的记录型元素数据的高速插入、删除和检索,而set是对单一数据的处理。二者都是泛型库对二叉树的一个泛化。

创建map对象

主要有下面几种方式。

(1)    map()

创建一个空的map对象,元素的键值类型为char,元素的映射数据类型为int,键值的比較函数对象为greater<char>

map<char,int,grater<char>> m;

(2)    map(const key_compare&cmp)

struct strLess{

bool operator()(const char* s1,const char*s2)const

{

return strcmp(s1,s2)<0;

}

};

map<const char*,int> m(strLess());

(3)    map(const map&)

拷贝构造函数。

map<int,char*> m1;

map<int,char*> m2(m1);

(4)    map(InputIteratorfirst,InputIterator last)

pair<const int,char> p1(1,‘a‘);

pair<const int,char> p2(2,‘b‘);

pair<const int,char> p3(3,‘c‘);

pair<const int,char> p4(4,‘d‘);

pair<const int,char> array[]={p1,p2,p3,p4};

map<const int,char> m(array,array+4);

(5)    map(InputIteratorfirst,InputIterator last, const key_compare&cmp)

map<const int,char,greater<const int>>m(array,array+4,greater<const int>());

元素的插入

元素的插入主要利用insert函数,利用数组操作也能够显式地为map赋值。可是不能检測是否插入成功。

#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<const char*,float> m;
	m["apple"]=1.5f;
	m["orange"]=2.0f;
	m["banana"]=1.1f;
	cout<<"苹果价格:"<<m["apple"]<<"元/斤"<<endl;
	cout<<"橘子价格:"<<m["orange"]<<"元/斤"<<endl;
	cout<<"香蕉价格:"<<m["banana"]<<"元/斤"<<endl;
	return 0;
}

元素的删除

与set集合容器一样,map容器能够删除某个迭代器位置上的元素。等于某个键值的元素。一个迭代器区间上的元素和容器中的全部元素。erase函数和clear函数。

元素的遍历

map元素的遍历除了利用键值的数组方式来訪问元素,还能够使用迭代器的方式进行訪问。

#include<iostream>
#include<map>
using namespace std;
struct stuInfo{
	char *name;
	int age;
};
struct stuRecord{
	int id;
	stuInfo sf;
};
int main()
{
	stuRecord sArray[]={{1,"li",20},{10,"shi",18},{3,"wang",21}};
	map<int,stuInfo> m;
	for(int i=0;i<3;i++)
	{
		m[sArray[i].id]=sArray[i].sf;
	}
	map<int,stuInfo>::iterator begin,end;
	end=m.end();
	cout<<"学号	"<<"姓名	"<<"年龄	"<<endl;
	for(begin=m.begin();begin!=end;begin++)
	{
		cout<<(*begin).first<<"	"
		<<(*begin).second.name<<"	"
		<<(*begin).second.age<<"	"
		<<endl;
	}

	return 0;
}

从结果能够看出,尽管是无序插入的,可是遍历出的结果是有序的。

元素的搜索

利用find函数能够搜索出具有某一键值的元素。

#include<iostream>
#include<map>
using namespace std;
struct stuRecord{
	struct stuInfo{
		char *name;
	    int age;
	};
	stuRecord(int id_,char *name_,int age_)
	{
		id=id_;
		sf.name=name_;
		sf.age=age_;
	}
	int id;
	stuInfo sf;
};

int main()
{
	typedef map<int,stuRecord::stuInfo> stuMap;
	stuMap m;
	pair<stuMap::iterator,bool> p;
	//插入第一条学生记录
	stuRecord stu1=stuRecord(5,"li",22);
	pair<int,stuRecord::stuInfo> pairStu1(stu1.id,stu1.sf);
	p=m.insert(pairStu1);
	if(!p.second)
		cout<<"插入学生记录失败\n";
	//插入第二条学生记录
	stuRecord stu2=stuRecord(1,"shi",20);
	pair<int,stuRecord::stuInfo> pairStu2(stu2.id,stu2.sf);
	p=m.insert(pairStu2);
	if(!p.second)
		cout<<"插入学生记录失败\n";
	//插入第三条学生记录
	stuRecord stu3=stuRecord(10,"zhang",21);
	pair<int,stuRecord::stuInfo> pairStu3(stu3.id,stu3.sf);
	p=m.insert(pairStu3);
	if(!p.second)
		cout<<"插入学生记录失败\n"; 

	//搜索
	stuMap::iterator i=m.find(5);
	cout<<"搜索学号为5的记录:\n"
	<<(*i).first<<‘	‘
	<<(*i).second.name<<‘	‘
	<<(*i).second.age<<‘	‘<<endl;

	return 0;
}

map还提供其它的函数,empty、size、swap、lower_bound、upper_bound、equal_range等。

multimap多重映射容器

multimap容器也是用红黑树对记录型元素数据依照键值的比較关系进行高速的插入、删除、检索,元素的检索是对数级的时间复杂度,与map不同的是,multimap同意将具有反复键值的元素插入容器,元素的键值与元素的映射数据的映射关系是多对多的。

创建multimap对象

有下面几种方式。

(1)    multimap()

multimap<char,int,greater<char>>mm;

(2)    multimap(constkey_compare&cmp)

struct strLess{

bool operator()(const char *s1,const char*s2)const

{

return strcmp(s1,s2)<0;

}

};

multimap<constchar*,int> mm(strLess());

(3)    multimap(const map&)

multimap<int,char*> mm1;

multimap<int,char*> mm2(mm1);

(4)    multimap(InputIteratorfirst,InputIterator last)

pair<constint,char> p1(1,‘a‘);

pair<constint,char> p2(1,‘e‘);

pair<constint,char> p3(2,‘b‘);

pair<constint,char> p4(3,‘c‘);

pair<constint,char> pairArray[]={p1,p2,p3,p4};

multimap<constint,char> mm(pairArray,pairArray+4);

(5)    multimap(InputIteratorfirst,InputIterator last, const key_compare&cmp)

multimap<constint,char,greater<const int>> mm(pairArray,pairArray+4,greater<constint>());

元素的插入

multimap容器仅仅能使用insert函数插入元素到容器的红黑树中。

multimap<float,char *> mm;

mm.insert(pair<float,char*>(3.0f,"apple"));

mm.insert(pair<float,char*>(3.0f,"pear"));

mm.insert(pair<float,char*>(2.1f,"orange"));

mm.insert(pair<float,char*>(1.5f,"banana"));

元素的删除

与map集合容器一样。map容器能够删除某个迭代器位置上的元素。等于某个键值的元素,一个迭代器区间上的元素和容器中的全部元素,erase函数和clear函数。

元素的遍历

multimap容器的遍历,能够用迭代器来实现。

#include<iostream>
#include<map>
using namespace std;
int main()
{
	multimap<float,char *> mm;
    mm.insert(pair<float,char *>(3.0f,"apple"));
    mm.insert(pair<float,char *>(3.0f,"pear"));
    mm.insert(pair<float,char *>(2.1f,"orange"));
    mm.insert(pair<float,char *>(1.5f,"banana"));

    multimap<float,char *>::iterator begin,end;
    end=mm.end();
    for(begin=mm.begin();begin!=end;begin++)
    {
    	cout<<(*begin).second<<"	"<<(*begin).first<<"元/斤"<<endl;
    }
    cout<<endl;
	return 0;
}

反向遍历

利用反向迭代器能够实现逆向遍历。

#include<iostream>
#include<map>
using namespace std;
int main()
{
	multimap<float,char *> mm;
    mm.insert(pair<float,char *>(3.0f,"apple"));
    mm.insert(pair<float,char *>(3.0f,"pear"));
    mm.insert(pair<float,char *>(2.1f,"orange"));
    mm.insert(pair<float,char *>(1.5f,"banana"));

    multimap<float,char *>::reverse_iterator rbegin,rend;
    rend=mm.rend();
    for(rbegin=mm.rbegin();rbegin!=rend;rbegin++)
    {
    	cout<<(*rbegin).second<<" "<<(*rbegin).first<<"元/斤"<<endl;
    }
	return 0;
}

元素的搜索

multimap容器的find函数将返回第一个搜索到的元素的位置,假设元素不存在将返回end结束元素位置。

其它经常使用函数

其它经常使用函数有empty、size、count、lower_bound、upper_bound等。

#include<iostream>
#include<map>
using namespace std;
int main()
{
	multimap<int,char> mm;
	cout<<mm.size()<<endl;
	mm.insert(pair<int,char>(3,‘a‘));
	mm.insert(pair<int,char>(3,‘c‘));
	mm.insert(pair<int,char>(1,‘b‘));
	mm.insert(pair<int,char>(2,‘d‘));
	mm.insert(pair<int,char>(3,‘e‘));
	mm.insert(pair<int,char>(4,‘g‘));

	cout<<mm.count(3)<<endl;
	cout<<mm.size()<<endl;

	return 0;
}

时间: 2024-10-10 02:16:54

map和multimap映射容器的相关文章

STL标准库-容器-map和multimap

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此map仍然具有自动排序的功能 我们无法使用迭代器改变元素的key(const key),但是可以改变元素的data. map的key必须独一无二,multimap的key可以重复 map的定义函数 template <typename _Key, typename _Tp, typena

GEEK学习笔记— —STL容器map和multimap

简介 在头文件<map> 中定义 namespace std { template <typename Key, typename T, typename Compare = less<Key>, typename Allocator = allocator<pair<const Key,T> > > class map; template <typename Key, typename T, typename Compare = less

4.3 map和multimap

使用map multimap必须包含头文件map *:multimap 1)multimap定义 template<class Key,class Pred=less<Key>,class A=allocator<T> class multimp { ..... typedef pair<const Key,T>value_type;    //value_type经常用到 ...... }; multimap每个对象都是pair模板类的对象.元素first成员变

【C++ STL】Map和Multimap

1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: key/value必须具有assigned(可赋值)和copyable(可复制的)性质. 对于排序而言,key必须具是comparable(可比较的). 2.能力 典型情况下,set,multisets,map,multimap使用相同的内部结构,因此可以将set和multiset当成特殊的map和m

C++ STL map和multimap

1.map简介 map 是关联容器的一种,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同. 注意:不能直接修改 map 容器中的关键字.因为 map 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果.要使用 map,必须包含头文件 <map>. 2.map的定义 template < class Key, class T, class P

Hibernate学习---第六节:数组&amp;list&amp;map&amp;set的映射配置

1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * 持久化类设计 * 注意: * 持久化类通常建议要有一个持久化标识符(ID) * 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值) * 持久化类

详解map、multimap、unordered_map、unordered_multimap

详解map.multimap.unordered_map.unordered_multimap 相信有不少同学和我一样刚接触C++ STL,被其深深吸引.但是想弄懂每个模板类不是一个容易事.大家应该对vector.list.stack.queue等类比较了解了,所以今天详细介绍下几个很常用很强大但有点不太好懂的类map.multimap.unordered_map.unordered_multimap.乍一看都差不多都是什么map,但这肯定有所不同.下面就在一个一个讲解的同时,让大家了解这四个类

实例讲解,set,multiset,map,multimap关联容器

测试环境:windows 7 vs2010 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 除了各容器都有的函数外,还支持以下成员函数: find: 查找等于某个值的元素(x小于y和y小于x同时不成立即为相等) lower_bound: 查找某个下界 upper_bound: 查找某个上界 equal_range: 同时查找上界和下界 count:计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等) insert: 用以插入一个元素或一个区间 在学习关联容器之前,我们先

C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式,但是erase的返回值为下一个有效的迭代器,所以   正确方法为:: for( iter = c.begin(); iter != c.end(); ) iter = c.erase(iter); 关联性容器::(map和set比较常用) erase迭代器只是被删元素的迭代器失效,但是返回值为void, 所