第二部分 容器和算法  第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迭代器都是随机访问迭代器
  • 泛型算法的结构
    • 算法的形参模式
      //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容器特有的操作和算法?

 posted on 2015-06-07 19:29  sherPur  阅读(170)  评论(0编辑  收藏  举报