标签:
关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。
两个基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用multimap或mutiset类型,这两种类型允许多个元素拥有相同的键。
在介绍关联容器之前,必须先介绍一种与它相关的简单的标准库类型--pair类型:
pair类型的初始化-------在头文件utility中
pair<T1,T2> p1; 创建一个pair对象,两个元素的类型分别是T1,T2类型,采用初值进行初始化
pair<T1,T2> p1(v1,v2); 创建一个pair对象,两个元素的类型分别是T1,T2类型,采用v1,v2分别进行初始化
make_pair(v1,v2); 以v1、v2的只进创建一个pair对象,类型分别是v1、v2的类型
p.first 返回p中第一个公有数据成员
p.second 返回p中第二个公有数据成员
pair使用:
#include<utility>
pair<string,int> author("Peter",30);
cout<<author.first<<"\t"<<author.second<<endl;//可以直接访问数据成员
//使用typedef进行简化
typedef pair<string,string> Student;
Student s1,s2("aaa","bbb");
s1.first="ccc";
s1.second="ddd";
//使用make_pair函数生成一个新的pair对象
string first="eee",second="fff";
Student s3=make_pair(first,second);
map 关联数组,通过键来存储和读取
map 初始化:
map<k,v> m1 创建一个名m的空的map对形象,对其键和值的类型分别为k、v
map<k, v> m(m2) 创建m2的副本m,m与m2的类型必须相同的键值类型和值类型
map<k,v> m(b,e) 创建map类型的对象m,存储迭代器b和e标记范围内所有元素的副本,元素的类型必须转换为pair<const k, v>
map定义的类型:
map<K,V>::key_type 在map中用做索引的键的类型
map<K,V>::mapped_type 在map中键所关联的值的类型
map<K,V>::value_type 一个pair类型,它的first元素具有const map<K,V>::key::type 类型,而second元素则为map<K,V>::mapped_type类型
map迭代器进行解引用将产生pair类型的对象,如:
map<string,int>::iterator map_it = word_count.begin();
cout<<map_it->first<<""<<map_it->second<<endl;
给map添加成员:
使用下标访问map对象:在map对象查找键值为x的元素如果找到则返回它的值(类型是map<k,v>::mapped_type),否则插入一个新的对象键值为x,值为map<k,v>中v的默 认初值。因此,使用下标访问map与使用下标访问数组或vector的行为不同,用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。这一特性可以使程序简练:
map<string,int> word_count;
word_count["Peter"]=10;//相当于增加一个键值对
//创建一个map对象,用来记录每个单词出现的次数,十分简洁。
//因为如果读取的是一个新单词,则将在word_count中添加以该单词为索引的新元素
map<string,int> word_count;
string word;
while(cin>>word)
{
++word_count[word];
}
使用Insert对map进行插入:
m .insert(e) e是一个用在m上的value_type类型的值,如果e.first不在m中则插入一个值为.second的新元素,否则该键值在m中已经存在则保持不变,该
函数返回一个pair新类型,包含一个指向键值为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入该元素
m.insert(beg,end) 插入beg、end标记范围内的元素,如果该元素的m.first已经存在则不插入否则插入。返回void类型
m.insert(iter,e) 如果e.first不在m中,则创建新元素,并以迭代器iter为起点搜索新元素的存储位置,否则返回一个迭代器,指向m中具有的给定键的元素。
//用insert方法重写单词统计程序
map<string,int> word_count;
word_count.insert(map<string,int>::value_type("aaa",1));
map<string,int> word_count;
string word;
while(cin>>word)
{
pair<map<string,int>::iterator,bool> ret=word_count.insert(make_pair<string,int>(word,1));
if(!ret.second)//如果没插入成功,证明原来已经存在键值,将统计值+1
{
++ret.first->second;// first是一个迭代器,指向插入的键
}
}
查找和读取map中的元素:
m.count(k) 返回k在m中出现的次数,在map中只是返回0、1
m.find(k) 如果k在m中的键值存在则返回相应的迭代器,否则返回超出来末端迭代器
//读取元素而又不插入新元素
int occurs;
map<string,int>::iterator it= word_count.find("foobar");//不存在,则返回end迭代器
if(it!=word_count.end())//可能找不到
{
occurs=it.second;
}
从map中删除元素 ,使用erase与顺序容器功能一样:
m.erase(k) 删除m中键为k的元素。返回值为被删除元素的个数,对于map容器而言,其值必然是0或1。
m.erase(p) 从m中删除迭代器p所指向的元素。返回值为void类型。
m.erase(b,e) 从m中删除一段由一对迭代器范围的元素。返回值为void类型。
map对象的迭代遍历:
map<string,int> word_count;
map<string,int>::const_iterator iter = word_count.begin();
while(iter!=word_count.end())
{
cout<<iter->second<<endl;
iter++;
}
set类型
Set的作用就是排序。每个元素的值不能直接被改变。 它是一个容器,它用于储存数据并且能从一个数据集合中取出数据。它的每个元素的值必须惟一,而且系统会根据该值来自 动将数据排序。每个元素的值不能直接被改变。
大小可变的集合,支持通过键值实现的快速读取。对于单纯想知道一个值是否存在则set容器最适用
在set容器中value_type不是pair类型,而是与key_value的类型相同,它的键值类型也是唯一的且不能修改
在set也支持find、count、insert、erase操作
在set中添加元素:;
set<int> set1;
pair<set<int>::iterator,bool> p=set1.insert(1);//返回pair类型对象,包含一个迭代器和一个布尔值
set1.insert(2);
int arr[]={1,2,3};
set<int> set2;
set2.insert(arr,arr+3);//返回void类型
从set中获取元素:与map方法使用类似,使用find和count函数。
标签:
原文地址:http://www.cnblogs.com/chengsong/p/5373137.html