parir类型
#include <utility>
pair类型所提供的操作:
pair<T1,T2> p1; 创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化
pair<T1,T2> p1(v1,v1); 创建一个pari对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,而second成员初始化为v2
make_pair(v1,v2) 以V1和V2值创建一个新的pair对象,其元素类型分别是v1和v2的类型
p1 < p2 两个pair 对象之间的小于运算,其定义按字典次序:
如果p1.first<p2.first 或 !(p2.first < p1.first) &&p1.second < p2.second, 则返回true
p1 == p2 如果两个pair对象的first 和second成员依次相等,则这两个对象相等
p.first 返回p中名为first的公有数据成员
p.second 返回p中名为second的公有数据成员
pair的创建和初始化
创建pair对象时, 必须提供两个类型名
pair<string, string> anon;
pair<string, int> word_count;
pair<string, vector<int> > line;
创建未始始化,则调用默认构造函数对其成员采用值初始化。
pair<string,string> author("James","Joyce")
如果需要定义多个相同的pair类型对象,可用typedef简化其声明:
typedef pair<string,string> Author;
Author proust("marcel","proust");
Author joyce("james","joyce");
对pair对象的操作:可直接访问其数据成员,其成员都是公有的,分别命名为first和second,只需使用普通的点操作符。
string firstBook;
if(joyce.first == "James" && joyce.second == "Joyce")
firstBook = "Setphen Hero";
生成新的pair 对象:标准提供make_pair对象,传递给它两个实参生成一个新的pair对象。
pair<string,string> next_auth;
string first, last;
while(cin >> first >> last) {
next_auth = make_pair(first,last);
}
关联容器
关联容器共享大部分非全部的顺序容器操作。关联容器不提供front,push_front,pop_front,back,push_back,pop_back操作。
在迭代器关联容器时,我们可以确保键的顺序访问元素,而与元素在容器中的存放位置完全无关。
map类型
map是键-值(key-value)对的集合。map类型通常可理解为关联数组:可使用键作为下标来获取一个值。
map对象的定义:
要使用map对象,则必须包含map头文件。
#include <map>
定义时必须指明键和值的类型:
map<string,int> word_count;
map的构造函数:
map<k,v> m; 创建一个名为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>::mappend_type类型
map迭代器进行解引用将产生pair类型的对象
eg:
map<string, int> word_count;
word_count["Anna"] = 1;
map<string,int>::iterator map_it = word_count.begin();
cout << map_it->first;
cout << " " << map_it->second;
++map_it->second;
给map添加元素
使用下标访问map对象
eg:
map <string,int> word_count;
word_count["Anna"] = 1;
所查找的键不存在时,map容器才为该键创建一个新的元素,并将它插入到些map对象中。
eg:
map<string,int> word_count;
string word;
while (cin >> word)
++word_count[word];
map::insert的使用
eg: word_count.insert(map<string,int>::value_type("Anna",1)); //inserts new element with value 1, position in first
<=> word_count.insert(make_pair("Anna",1));
<=> typedef map<string,int>::value_type valType;
word_count.insert(valType("Anna",1));
map对象中一个给定键只对应一个元素,如果插入的元素对应键已在窗口中,则insert将不做任何操作。
下标操作如果键不在map容器中,会插入一个具有该键的新元素。
eg:map<string,int> word_count;
int occurs = word_count["foobar"]; //values=0;
不修改map对象的查询操作
m.cout(k) 返回m中k的出现次数
m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器end
用count检查map对象中某键是否存在
eg:int occurs = 0;
if(word_count.count("foobar"))
occurs = word_count["foobar"];
读取元素而又不插入新元素
eg:int occurs = 0;
map<string,int>::iterator it = word_count.find("foobar");
if(it != word_count.end())
occurs = it->second;
从map对象中删除元素:
m.erase(k) 删除键为K的元素,返回size_type类型的值,表示删除的元素个数
m.erase(p) 删除p所指向的元素。返回void。
m.erase(b,e) 删除一段范围内的元素,由迭代器b和e 标记范围。返回void
map对象的迭代器
eg:map<string,int>::const_iterator map_it = word_count.begin();
while(map_it != word_count.end()){
cout << map_it->first << " occurs "
<< map_it->second << " times " << endl;
++map_it;
}