九章 札记--C++ primer 之旅

进入容器的学习了。

顺序容器:
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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值