C++_顺序容器

顺序容器类型

顺序容器

  • vector: 支持快速随机访问
  • list: 支持快速插入与删除
  • deque: 双端队列

顺序适配器
- stack: 后进先出(LIFO)堆栈
- queue: 先进先出(FIFO)队列
- priority_queue: 有优先级管理的队列

上述顺序容器包含于以下头文件中:< vector >,< list >,< deque >;
所有的容器类型都定义了默认的构造函数,用于创建指定的空容器类型, 默认构造函数不带参数

容器构造函数
//C为容器名, T元素类型(T也可以是容器类型), c容器

  1. C< T > c; 创建一个空容器,适用所有容器
  2. C c(c2); 创建容器c2的副本, c与c2具有相同的容器类型, 用于存放相同类型元素,适用所有容器
  3. C c(begin,end); 创建c,其元素为begin到end内元素副本,适用所有容器
  4. C c(n,t); 创建n个值为t的容器, t必须是C的元素类型值, 只适用于顺序容器
  5. C c(n); 创建n个值初始化元素的容器,只适用于顺序容器

    注: 将一个容器复制给另一个容器的时候, 容器类型,元素类型必须匹配;
    容器内元素类型必须支持赋值运算, 元素对象必须可以复制(IO流对象就不可以作为元素类型,不支持复制或赋值)
    例:

vector<int> v1;
vector<int> v2(v1);//ok
list<int> l(v1);//error 容器类型不匹配
vector<double> v3(v1);//error 元素类型不匹配

迭代器
所有迭代器都具有相同接口, 迭代器可看做指针;
迭代器常用运算

  • *iter : 返回迭代器iter所指向元素的引用
  • ++iter/iter++/iter–/–iter : 给iter加1或减1,使其指向容器中前一个元素与后一个元素
  • iter==/!= : 比较两个迭代器是否相等, 两个迭代器指向容器中同一个元素时,迭代器相等

vector与deque容器中提供额外运算, 可进行+/-n的算术运算,以及比较大小, 等同于数组中元素地址的运算
注: 在迭代器范围中遵守: [begin, end) ,end表示最后一个元素的后一个位置, 当begin等于end的时候则容器为空; 在元素的添加或删除的时候, 应该相应调整迭代器的值,避免产生无效的迭代器

容器定义的类型

  • size_type: 无符号整数,表示容器的最大存储长度
  • iterator: 容器迭代器类型
  • const_iterator: 只读迭代器,类似于 const TYPE* iter
  • reverse_iterator: 按逆序查找元素
  • difference_type: 存储两个迭代器的差值(包含负数)

    在顺序容器中添加元素

  • c.push_back(t): 尾部插入t, 返回void

  • c.push_front(t): 前端插入t, 返回void, 只适用于list ,deque (其主要原因在于list,deque可基于链表实现,而vector为数组,其扩容方式与链表不同)
  • c.insert(p,t): 在迭代器p所指向的元素前面插入元素为t的新元素, 返回添加新元素的迭代器
  • c.insert(p,n,t): 在迭代器p所指向的元素前面插入n个值为t的新元素, 返回void
  • c.insert(p,b,e): 在迭代器p所指向元素的前面插入由迭代器b和e标记的范围元素, 返回void

注:push_back与push_fron 也可写成: c.insert(c.end(), t)与c.insert(c.begin(),t) ,vector不可push_front;
在插入元素后应注意迭代器的更新, 当新元素插入后迭代器都将出现失效, 在循环使用insert的时候应注意迭代器的更新
例:

vector<int>::iterator first=v.begin(), last=v.end();
while(first!=last){
    cin>>t;
    first=v.insert(first,t);
    ++first;
}
//上述操作将出现死循环,每次元素的添加将导致last迭代器的改变,last未更新,需每次添加后将last=v.end()

容器之间的比较
容器之间的比较必须二者具有相同容器类型和元素类型;
容器之间的比较是基于元素类型的比较运算,若当前元素类型不支持大小比较, 那容器就不能进行比较操作
所有容器都通过比较其元素对来实现关系运算

容器大小容量操作

  • c.size() : 返回容器c中元素个数,返回类型为c::size_type
  • c.max_size(): 返回容器的最大容纳量,返回c::size_type
  • c.empty(): 返回标记容器大小是否为0的bool值
  • c.resize(n): 重新调整容器大小,使其能容纳n个元素,超出范围时,删除多余元素(属于压缩容器)
  • c.resize(n,t): 重新调整容器大小,使其能容纳n个元素,所添加的新元素的值都为t

注: resize操作将导致迭代器失效

访问顺序容器元素

  • c.back(): 返回c最后一个元素的引用,c为空时, 该操作未定义
  • c.front(): 返回第一个元素的引用,c为空, 则操作未定义
  • c[n] : 返回下标为n的元素的引用, n<0||n>c.size(), 则操作未定义,只适用于vector与deque
  • c.at(n):与c[n]一致

顺序容器元素删除

  • c.erase(p): 删除迭代器p所指向的元素,返回一个迭代器, 指向被删除元素的后一位置, p若超出末端则操作未定义
  • c.erase(b,e): 删除迭代器b,e标记的范围内所有元素, 返回一个迭代器,指向被删除元素的后一位置,超出末端的时候返回超出末端的下一位置
  • c.clear(): 删除所有元素,返回void
  • c.pop_back(): 删除容器c的最后一个元素,返回void,c为空时则操作未定义
  • c.pop_front():删除c的第一个元素,返回void,只适用于list或deque

注:采用pop_front与front结合使用,可实现栈结构

list<int>ll;
while(!ll.empty()){
    cout<<ll.front();
    ll.pop_front();
}

当使用erase删除时,必须保证迭代器位置正确
删除操作也会导致迭代器失效

容器的选择

  1. 程序要求随机访问元素,使用vector或deque
  2. 必须在中间位置插入元素,采用list
  3. 在首位插入元素,采用deque
  4. 若既要支持随机访问且可较快插入,可将list容器作为vector的类型,或者将vector容器作为list的类型( 类似于java中的ArrayList)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值