C++ Primer(关联容器)
2014-12-25 09:03
92 查看
第十章 关联容器
set容器适合有效的存储不同值的集合,map容器适合需要存储每个键所关联的值的情况。
10.1 pair类型
在utility头文件中定义
1.创建pair对象,必须提供两个类型名
pair<string,string> anon;
2.pair对象的操作
使用普通的点操作符--成员访问标志即可访问其成员。
pair<string,string> author("james","joyce");
string firstBook;
if(author.first=="james"&&author.second=="joyce")
firstBook="stephen hero";
3.生成新的pair对象
make_pair函数传递给它两个实参生成一个新的pair对象。
10.2关联容器
关联容器共享大部分顺序容器的操作。但不提供front、push_front、pop_front、back、push_back、pop_back操作。
10.3 map类型
10.3.1 map对象的定义
注:对于键类型,唯一的约束就是必须支持 < 操作符
map<string,int> word_count;
10.3.2 map定义的类型
注:map迭代器进行解引用将产生pair类型的对象
value_type是pair类型,它的值成员可以修改,键成员不可修改。
map迭代器进行解引用产生pair类型的对象
map<string,int>::iterator map_it=word_count.begin();
cout<<map_it->first;
cout<<""<<map_it->second;
++map_it->second;
10.3.3 给map添加元素
可使用insert成员实现;也可先用下标操作符获取元素,然后给获取的元素赋值
10.3.4 使用下标访问map对象
word_count["Anna"]=1;
使用下标访问不存在的元素将导致在map容器中添加一个新元素,它的键就是该下标值。
cout<<word_count["Anna"]; //prints 1
++word_count["Anna"];
cout<<word_count["Anna"];//prints 2
下标行为可用于记录每个单词出现的次数
map<string,int> word_count;
string word;
while(cin>>word){
++word_count[word];
}
10.3.5 map::insert的使用
1.以insert代替下标运算
word_count.insert(map<string,int>::value_type("Anna",1));
或者
word_count.insert(make_pair("Anna",1));
2.检查insert的返回值
map<string,int> word_count;
string word;
while(cin>word){
pair<map<string,int>::iterator,bool> ret=word_count.insert(make_pair(word,1));
if(!ret.second)
++ret.first->second;
}
pair对象包含一个迭代器和一个bool值,迭代器指向map中相应键的元素,bool表示是否插入了该元素。
++((ret.first)->second);从insert返回的pair对象中获取map迭代器,进行解引用,获取一个value_type类型的对象,它的second成员就是我们所添加的元素的值的部分,然后实现该值的自增。
10.3.6 查找并读取map中的元素
int occurs=0;
if(word_count.count("foobar"))
occurs=word_count["foobar"];
使用count检查map对象中某键是否存在,如果存在,可用下标操作访问该元素,实际上这指向了两次查找。如果希望存在该元素就访问,可用find
count成员的返回值只能是0或1。
int occurs=0;
map<string,int>::iterator it=word_count.find("foobar");
if(it!=word_count.end())
occurs=it->second;
find操作返回元素的迭代器,不存在返回end迭代器。
10.3.7 从map对象中删除元素
10.3.8 map对象的迭代遍历
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;
}
10.4 set类型
set容器是单纯的键的集合,键唯一且不可修改
set操作包括:
所有通用的容器操作,表3中的构造函数,表5的insert,表6的count和find,表7的erase。
10.4.1 set容器的定义和使用
添加元素
set<string> set1;
set1.insert("the");
set1.insert(ivec.begin(),ivec.end());
获取元素
set1.find(1);
set<int>::iterator set_it=iset.find(1);
*set_it=11;//error,read-only
cout<<*set_it<<endl;
set中的元素只能进行读操作
10.4.2 单词排除
void restriced_wc(iftream &remove_file,map<string,int> &word_count)
{
set<string> excluded;
string remove_word;
while(remove_file>>remove_word)
excluded.insert(remove_word);
string word;
while(cin>>word)
if(!excluded.count(word))
++word_count[word];
}读入不在排除集中的单词并计数
10.5 multimap和multiset类型
每次调用insert总会添加一个元素
带有一个键参数的erase将删除拥有该键的所有元素,并返回删除元素的个数。带有迭代器参数的erase删除指定元素,返回void类型
equal_range函数返回一对迭代器的pair对象,第一个指向该键关联的第一个实例,第二个指向该键关联的最后一个实例的下一位置。
string search_item("alain");
typedef multimap<string,string>::iterator auchors_it;
pair<authors_it,authors_it> pos=authors.equal_range(rearch_item);
while(pos.first!=pos.second){
cout<<pos.first->second<<endl;
++pos.first;
}
表10-1 关联容器类型 | |
map | 关联数组:元素通过键来存储和读取 |
set | 大小可变的集合,支持通过键实现的快速读取 |
multimap | 支持同一个键多次出现的map类型 |
multimap | 支持同一个键多次出现的set类型 |
10.1 pair类型
在utility头文件中定义
表10-2 pair类型提供的操作 | |
pair<T1,T2> p1; | 创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化 |
pair<T1,T2> p1(v1, v2); | 创建一个pair对象,它的两个元素分别是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.seond<p2.second,则返回true |
p1 == p2 | 如果两个pair对象的first和second成员依次相等,则这两个对象相等。该运算使用其元素的==操作符 |
p.first | 返回p中名为first的公有数据成员 |
p.second | 返回p中名为second的公有数据成员 |
pair<string,string> anon;
2.pair对象的操作
使用普通的点操作符--成员访问标志即可访问其成员。
pair<string,string> author("james","joyce");
string firstBook;
if(author.first=="james"&&author.second=="joyce")
firstBook="stephen hero";
3.生成新的pair对象
make_pair函数传递给它两个实参生成一个新的pair对象。
10.2关联容器
关联容器共享大部分顺序容器的操作。但不提供front、push_front、pop_front、back、push_back、pop_back操作。
10.3 map类型
10.3.1 map对象的定义
表10-3 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<string,int> word_count;
10.3.2 map定义的类型
表10-4 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类型 |
value_type是pair类型,它的值成员可以修改,键成员不可修改。
map迭代器进行解引用产生pair类型的对象
map<string,int>::iterator map_it=word_count.begin();
cout<<map_it->first;
cout<<""<<map_it->second;
++map_it->second;
10.3.3 给map添加元素
可使用insert成员实现;也可先用下标操作符获取元素,然后给获取的元素赋值
10.3.4 使用下标访问map对象
word_count["Anna"]=1;
使用下标访问不存在的元素将导致在map容器中添加一个新元素,它的键就是该下标值。
cout<<word_count["Anna"]; //prints 1
++word_count["Anna"];
cout<<word_count["Anna"];//prints 2
下标行为可用于记录每个单词出现的次数
map<string,int> word_count;
string word;
while(cin>>word){
++word_count[word];
}
10.3.5 map::insert的使用
表10-5 map容器提供的insert操作 | |
m.insert( e ) | e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则插入一个值为e.second的元素;如果该键在m中已存在,则保持m不变。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素 |
m.insert(beg, end) | beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的键-值对。对于该范围内的所有元素,如果它的键在m中不存在,则将该键及其关联的值插入到m。返回void类型 |
m.insert(iter, e) | e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返回一个迭代器,指向m中具有给定键的元素 |
word_count.insert(map<string,int>::value_type("Anna",1));
或者
word_count.insert(make_pair("Anna",1));
2.检查insert的返回值
map<string,int> word_count;
string word;
while(cin>word){
pair<map<string,int>::iterator,bool> ret=word_count.insert(make_pair(word,1));
if(!ret.second)
++ret.first->second;
}
pair对象包含一个迭代器和一个bool值,迭代器指向map中相应键的元素,bool表示是否插入了该元素。
++((ret.first)->second);从insert返回的pair对象中获取map迭代器,进行解引用,获取一个value_type类型的对象,它的second成员就是我们所添加的元素的值的部分,然后实现该值的自增。
10.3.6 查找并读取map中的元素
表10-6 不修改map对象的查询操作 | |
m.count(k) | 返回m中k的出现次数 |
m.find(k) | 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器 |
if(word_count.count("foobar"))
occurs=word_count["foobar"];
使用count检查map对象中某键是否存在,如果存在,可用下标操作访问该元素,实际上这指向了两次查找。如果希望存在该元素就访问,可用find
count成员的返回值只能是0或1。
int occurs=0;
map<string,int>::iterator it=word_count.find("foobar");
if(it!=word_count.end())
occurs=it->second;
find操作返回元素的迭代器,不存在返回end迭代器。
10.3.7 从map对象中删除元素
表10-7 从map对象中删除元素 | |
m.erase(k) | 删除m中键为k的元素。返回size_type类型的值,表示删除的元素个数 |
m.erase(p) | 从m中删除迭代器p所指向的元素。p必须指向m中确实存在的元素,而且不能等于m.end()。返回void类型 |
m.erase(b, e) | 从m中删除一段范围内的元素,该范围由迭代器对b和e标记。b和e必须标记m中的一段有效范围:即b和e都必须指向m中的元素或最后一个元素的下一位置。而且,b和e要么相等(此时删除的范围为空),要么b所指向的元素必须出现在e所指向的元素之前。返回void类型 |
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;
}
10.4 set类型
set容器是单纯的键的集合,键唯一且不可修改
set操作包括:
所有通用的容器操作,表3中的构造函数,表5的insert,表6的count和find,表7的erase。
10.4.1 set容器的定义和使用
添加元素
set<string> set1;
set1.insert("the");
set1.insert(ivec.begin(),ivec.end());
获取元素
set1.find(1);
set<int>::iterator set_it=iset.find(1);
*set_it=11;//error,read-only
cout<<*set_it<<endl;
set中的元素只能进行读操作
10.4.2 单词排除
void restriced_wc(iftream &remove_file,map<string,int> &word_count)
{
set<string> excluded;
string remove_word;
while(remove_file>>remove_word)
excluded.insert(remove_word);
string word;
while(cin>>word)
if(!excluded.count(word))
++word_count[word];
}读入不在排除集中的单词并计数
10.5 multimap和multiset类型
每次调用insert总会添加一个元素
带有一个键参数的erase将删除拥有该键的所有元素,并返回删除元素的个数。带有迭代器参数的erase删除指定元素,返回void类型
表10-8 返回迭代器的关联容器操作 | |
m.lower_bound(k) | 返回一个迭代器,指向键不小于k的第一个元素 |
m.upper_bound(k) | 返回一个迭代器,指向大于k的第一个元素 |
m.equal_range(k) | 返回一个迭代器的pair对象 它的first成员等价于m.lower_bound(k)。而second成员则等价于m.upper_bound(k) |
string search_item("alain");
typedef multimap<string,string>::iterator auchors_it;
pair<authors_it,authors_it> pos=authors.equal_range(rearch_item);
while(pos.first!=pos.second){
cout<<pos.first->second<<endl;
++pos.first;
}
相关文章推荐
- 《C++ Primer》 第10章 关联容器
- 《C++ Primer 4 Answer Book》 整理[9]——第10章 关联容器
- C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器
- C++ Primer学习之(10)——关联容器
- [C++ Primer] : 第11章: 关联容器
- C++ Primer 【第四版】第十章 关联容器
- 【C++ Primer】关联容器
- 《c++ primer》第 10 章 关联容器
- C++关联容器之set类型——《C++ Primer》抄书笔记
- C++ Primer 读书笔记 Charpter 10 关联容器
- C++ Primer 学习笔记:关联容器入门 set && map
- 【C++ Primer 学习笔记】: 容器和算法之【关联容器】
- C++ Primer 10 关联容器
- 【C++ Primer 学习笔记】 chapter 10 关联容器
- 【C++ Primer】【学习笔记】【第十章】关联容器之:map类型
- C++ Primer 4 第十章 关联容器
- C++ Primer 学习笔记——关联容器初识
- 《C++ Primer》 关联容器
- C++ Primer 随笔 Chapter 10 关联容器
- C++ primer第二次阅读学习笔记(第10章:关联容器)