第二部分 容器和算法 第9章~第11章
2015年5月13日 星期三
第9章 顺序容器 sequential contai顺序容器的定义
vector<string> svec; list<int> ilist; deque<double> ddeq;
- 容器元素的初始化,将一个容器初始化为另一个容器的副本,初始化为一段元素的副本,分配和初始化指定数目的元素
- 容器内元素的类型约束:元素必须支持赋值运算,元素类型的对象必须可以赋值。事实上,除了输入输出标注库类型外,其他标准库类型都是有效的容器元素类型
- 迭代器和迭代器范围
- 迭代器为所有标准库容器类型提供的运算,*iter,iter->num,++iter,iter1==iter2,iter1!=iter2
- 迭代器为vector和deque容器提供额外的运算,iter+/-n,iter1+/-=iter2,iter1-iter2,>,>=,<,<=
- 迭代器范围,beg,end,左闭合区间,[beg,end)
- 顺序容器的操作
- 添加元素
//通用 c.push_back(text_word); c.push_front(t) //只适用于list和deque c.insert(p,t); c.insert(p,n,t); c.insert(p,b,e);
- 容器大小的操作,c.size();c.max_size();c.empty()
- 访问元素,c.back();c.front();返回元素的引用
- 删除元素,c.pop_back();c.pop_front()(不适用于vector),c.erase(p);c.erase(b,e);
- 添加元素
- vector容器的自增长,capacity和reserve成员函数
- 容器的选用,插入操作影响容器的选择,元素访问的影响
- 如果程序要求随机访问元素,应该使用vector或deque容器
- 如果程序必须在容器中间插入或删除元素,用list容器
- 如果程序在容器两侧插入或删除元素,采用deque容器
- 再谈string类型
- 构造string对象的其他方法
- 修改string对象的方法,与容器共存的操作,string特有的操作
- 只适用string类型的操作,c.substr(pos,n);c.substr(pos);s.substr();append()和replace()函数
- string类型的查找操作,s.find(args);s.rfind(args)
- string对象的比较
- 容器适配器,queue,priority_queue和stack
- 初始化,stack<int> stk<deq>;将deq的元素拷贝到stk,
第10章 关联容器 associative container
关联容器通过键key存储和访问元素,顺序容器则通过元素在容器中的位置顺序存储和访问元素
- 引言,pair类型
- pair的创建和初始化,pair<string,string> anon
- pair对象的操作,直接访问,typedef pair<string,string> Author; Author a1;a1.first;1.second
- 生成新的pari对象,make_pair()函数生成
- 关联容器,共享大部分的顺序容器操作,不提供front,push_front,pop_front,back,push_back,pop_back操作
- map类型
- 对象的定义,约束:键类型必须支持“小于“操作
map<k,v> m; map<k,v> m(m2); map<k,v> m(b,e);
- map定义的类型,key_type键类型,mapped_type值类型,value_type是pair类型
- 使用下标访问map
- 利用insert插入对象
- 查找并读取map元素,m.count(k);m.find(k)
- 从map中删除元素,m.erase(k);
- 对象的定义,约束:键类型必须支持“小于“操作
- set类型
set容器中,value_type不是pair类型,而是与key_type类型相同的类型。set存储的元素仅仅是键,而没有所关联的值,
与map一样,set容器存储的键也必须是唯一的,而且不能修改
- multimap和multiset类型
- 允许一个键对应多个实例
- 元素的添加和删除,insert,erase
- 元素的查找,multiset和multimap中元素按照顺序存储,即一个键关联的元素必然相邻存放
- find和count操作
- lower_bound(k)不小于k的第一个元素,upper_bound(k)返回大于k的第一个元素,左闭合区间
- equal_range()函数
第11章 泛型算法 generic algorithm
- 概述,每个泛型算法的实现都独立于单独的容器
- 初窥算法,头文件 #include <algorithm> ,#include <numeric>
- 只读算法,只读取其输入范围内的元素,而不会写这些元素
- 写容器元素的算法,写入输入序列的元素,不检查写入操作的操作
- 对容器元素重新排序的算法
- 再谈迭代器,除了标准库定义的不依懒于特定容器的迭代器,C++还提供了另外三种迭代器
- 插入迭代器,insert iterator
- back_insertor,创建使用push_back实现插入的迭代器
- front_insertor,使用push_front实现插入
- insertor,使用insert实现插入操作,产生在指定位置实现插入的迭代器
- iostream迭代器
- istream_iterator
- ostream_iterator
- 反向迭代器, reserve iterator反向遍历容器,从最后一个到第一个元素
- reverse_iterator
- rbegin(),rend()
- const迭代器,const_iterator,迭代器不能修改容器中的元素
- 五种迭代器(根据所提供的操作集分类)
- 输入迭代器:只读不写,只支持自增运算,要求在这个层次上提供支持的泛型算法包括find,accumulate。istream_iterator是输入迭代器
- 输出迭代器:写,不读,ostream_iterator,自增
- 前向迭代器:读和写,自增,需要前向迭代器的泛型算法包括replace
- 双向迭代器:读和写,支持自增和自减,reverse需要使用双向迭代器
- 随机访问迭代器:读和写,支持完整的算术运算,sort算法使用随机访问迭代器,vector,deque和string迭代器都是随机访问迭代器
- 插入迭代器,insert iterator
- 泛型算法的结构
- 算法的形参模式
//alg是算法名字,beg和end知道算法操作元素的范围 //dest,beg2,end2都是迭代器 alg(beg,end,other parms); alg(beg,end,dest,other parms); alg(beg,end,beg2,other parms); alg(beg,end,beg2,end2,other parms);
- 算法的形参模式
- 容器特有的算法
list容器上的迭代器是双向而非随机访问,list容器特有的操作和算法?