进入容器的学习了。
顺序容器:
vector 快速随机访问list 快速插入/删除deque 双端队列
顺序容器适配器:(适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型)
stack
queue
priority_queue
注意: 大多数程序中,容器类型默认构造函数能达到最佳运行时性能。
容器构造函数:
C <T> c 创建空容器
C <T> c(c2) 创建容器c2 的副本c
C <T> c(b,e) c 的元素是迭代器 b 和 e 表示的范围内元素的副本,不要求容器类型相同,只要元素类型相互兼容即可
C <T> c(n,t) n 个 值为 t 的容器,只适用于顺序容器
C <T> c(n) 有n个值初始化的容器,只适用于顺序容器
注: 指针就是迭代器
EX: char *word[]={"statly","abc","123"};
size_t words_size = sizeof(word)/sizeof(char*)
list<string> word2(word,word+size_t);
容器内元素的类型约束:
1) 元素类型必须支持赋值运算
2) 元素类型的对象必须可以复制
注: 除引用类型外,所有内置或复合类型都可以。
除IO标准库类型及(auto_ptr) 之外,所有其他标准库类型都是有效的容器元素类型
容器的容器:
EX: vector< vector<string> >lines;
注意: 必须用空格隔开两个相邻的> 符号,否则跟右移>> 符号混淆。
容器定义的类型名:
value_type 元素类型
reference 元素的左值类型, 相当于 value_type& ,就是该类型引用的意思
const_reference 元素的常量左值类型; 等效于 const value_type&;
顺序容器 添加元素的操作:
c.push_back(t) 尾部添加元素t, 返回 void 类型
c.push_front(t) 前端添加元素t,返回 void 类型 注: 只适用于 list 和 deque 容器
insert 操作:
c.insert(p,t) 在迭代器p所指向的元素前面插入值为t 的元素,返回指向新添加元素的迭代器(有用的返回值)
c.insert(p,n,t) 在迭代器p所指向的元素前面插入n个值为t 的元素。返回void类型
c.insert(p,b,e) 在迭代器p所指向的元素前面插入 迭代器 b和e 标记的范围内的元素,返回void 类型
任何insert 或 push操作都可能导致迭代器失效。循环中将元素插入到vector 或 deque 中,必须确保迭代器在每次循环后得到更新。
关系操作符:
使用元素提供的关系操作符实现容器的关系运算。C++ 只允许两个容器做其元素类型定义的关系运算。
意思即 两个容器要进行关系比较有两个条件:
1) 两个容器的类型应该一样。
2)元素类型也一样,且元素本身支持这种关系运算 > 或 < 之类的关系比较。
容器大小的操作:
c.size(); 元素的个数; 返回类型: c::size_type
c.max_size(); c可容纳的最多元素的个数; 返回类型: c::size_type
c.empty() 容器是否为空
c.resize(n); 调整c的长度大小 ,使能容纳n个元素。
n<c.size(): 删除多的; 否则,添加初始化的元素
c.resize(n,t); ......添加的新元素值为t
访问元素:
c.back() 返回c的最后一个元素的引用。
c.begin() 返回c的第一个元素的引用。
c[n] 返回下标为n的元素的引用。 只适用于 vector 和 deque 随机访问特性
c.at(n) 返回下标为n的元素的引用。
只适用于 vector 和 deque
注意: 如果容器为空 或 适用越界的下标,都会导致程序严重的错误
删除元素:
c.erase(p); 删除迭代器p所指向的元素,返回一个迭代器,指向被删除元素后面的元素。注意:执行此操作前,必须保证p有效,指向某个元素。
c.erase(b,e); 删除迭代器b和e范围内的元素,返回一个迭代器,指向被删除元素后面的元素。
c.clear(); 删除所有元素,放回void
c.pop_back(); 删除最后一个元素; 返回void
c.pop_front(); 删除第一个元素;
返回void 只用于list 和 deque
赋值与swap
赋值操作
c1=c2 注: c1和c2的类型(容器类型和元素类型)必须相同
c1.swap(c2) 交换内容; (容器类型和元素类型)必须相同。执行速度比赋值运算快。
c.assign(b,e) 重新设置c元素,将迭代器b和e 范围内的元素复制到c中。b 和 e 必须不指向c中元素的迭代器。(容器类型 不做要求和元素类型相互兼容)
c.assign(n,t) c中重新设置为 n个值为t的元素。
原因解析: c.assign(b,e); assign操作首先删除容器中原来的所有元素,因此,传递给assign函数的迭代器不能指向调用该函数的容器的元素。
赋值后,左右容器相等(即长度相等,元素相同)
swap: 该操作在常量时间内完成,迭代器不会失效。 迭代器指向同一个元素。
vector 的容量 及 自增长
两个成员: capacity 和 reserve
capacity: 返回容器在必须重新分配存储空间之前可以存储元素的个数。
reserve:操作vector 容器 应该预留多少个元素的存储空间
vector 的分配策略:加倍当前容量;
string 类型:
is>>s; 从输入流is中读取一个以空格字符隔开的字符串,写入s
os<<s; 将s写入到输出流os中
getline(is,s); 从输入流is中读取一行字符,写入s
string 类型就是一个字符容器; 容器vector 的操作基本上string 都有
string 类型的查找操作:
返回类型: 成功: string::size_type
失败: string::npos
容器适配器:
三种顺序容器适配器: queue, priority_queue, stack
适配器的初始化:
1)默认构造函数创建空对象
2)带容器参数的构造函数将 容器的副本作为基础值
EX : stack<int> stk(deq); // deq 是 deque<int> 类型的容器
默认的stack 和 queue 都是基于 deque 容器实现的。
priority_queue 在vector 容器实现的。
覆盖基础容器类型:
将顺序容器指定为适配器的第二个类型实参
EX:stack< string, vector<string> > str_stk;
对于给定的适配器,其关联的容器必须满足一定的约束:
stack: 都可以。 vector, list , deque
queue: 提供push_front ,因此只能 list, deque
priority_queue : 随机访问, vector 或 deque