当前位置: 首页 > news >正文

STL容器的使用

为什么80%的码农都做不了架构师?>>>   hot3.png

1、vector

    vector是一个十分有用的容器,下面对这个容器做一下总结。(连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销.

基本操作:

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;  记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);  在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);  删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);  删除区间[i,j-1];区间从0开始

(8)向量大小:  vec.size();

(9)清空:  vec.clear();


2、list

    双向线性表list容器。(每个元素间用链表相连)访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况。

   list类定义了双向的线性表。Vector类支持随机访问,但list只能支持顺序访问,由于list是双向的,因此我们可以按从前到后或者从后到前的顺序来访问list。

1.创建一个list对象

#include<list>
using namespace std;
     
list<int> lst1;
list<char> 
lst2;

2.向list对象中添加数值
从前面添加:

lst1.push_front(0);
lst1.push_front(1);

从后面添加:

lst1.push_back(0);   
lst1.push_back(1);

3.删除操作
删除list对象中的第一个元素

lst1.pop_front();

删除list对象中的最后一个元素

lst1.pop_back();

4.获得list对象的存储容量

lst1.size();

5.获得list对象中第一个和最后一个元素

list<int>::iterator p = lst1.begin();
list<int>::iterator p = lst1.end();

6.在list对象中插入元素

list<int>::iterator p = lst1.begin();
p++;
lst1.insert(p, 2 , 100);

7.在list对象中删除元素;

list<int>::iterator p1 = lst1.begin();
list<int>::iterator p2 = lst1.begin(); 
for (i=0;i<5;i++) p2++;lst1.erase(p1, p2);

8.访问list对象中的内容

list<int>::iterator p = lst1.begin();
while (p!=lst1.end())
{
     *p = *p + 100;
         p++;
}

9.将list对象中的内容排序;

lst1.sort();

(补充:

1list中的构造函数:

list() 声明一个空列表;

list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的

list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的

list(n,val) 声明一个和上面一样的列表

list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素

2 begin()和end():通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的 end() 函数来得到list末端下一位置,相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。

3 push_back() 和push_front():使用list的成员函数push_back和push_front插入一个元素到list中。其中push_back()从list的末端插入,而 push_front()实现的从list的头部插入。

4 empty():利用empty() 判断list是否为空。

5 resize(): 如果调用resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除,如果需要扩展那么调用默认构造函数T()将元素加到list末端。如果调用resize(n,val),则扩展元素要调用构造函数T(val)函数进行元素构造,其余部分相同。

6 clear(): 清空list中的所有元素。

7 front()和back(): 通过front()可以获得list容器中的头部元素,通过back()可以获得list容器的最后一个元素。但是有一点要注意,就是list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。

8 pop_back和pop_front():通过删除最后一个元素,通过pop_front()删除第一个元素;序列必须不为空,如果当list为空的时候调用pop_back()和pop_front()会使程序崩掉。

9 assign():具体和vector中的操作类似,也是有两种情况,第一种是:l1.assign(n,val)将 l1中元素变为n个T(val)。第二种情况是:l1.assign(l2.begin(),l2.end())将l2中的从l2.begin()到l2.end()之间的数值赋值给l1。

10 swap():交换两个链表(两个重载),一个是l1.swap(l2); 另外一个是swap(l1,l2),都可能完成连个链表的交换。

11 reverse():通过reverse()完成list的逆置。

12 merge():合并两个链表并使之默认升序(也可改),l1.merge(l2,greater<int>()); 调用结束后l2变为空,l1中元素包含原来l1 和 l2中的元素,并且排好序,升序。其实默认是升序,greater<int>()可以省略,另外greater<int>()是可以变的,也可以不按升序排列。)


3、queue

queue<int> q1;
queue<double> q2;

queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()


4、stack
stack 模板类的定义在<stack>头文件中。
stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要
的,在不指定容器类型时,默认的容器类型为deque。
定义stack 对象的示例代码如下:
stack<int> s1;
stack<string> s2;
stack 的基本操作有:
入栈,如例:s.push(x);
出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s.top()
判断栈空,如例:s.empty(),当栈空时,返回true。
访问栈中的元素个数,如例:s.size()。

转载于:https://my.oschina.net/Jacedy/blog/347768

相关文章:

  • Mysql索引类型 Normal,Unique,Full Text
  • Linux定时任务没有执行的总结
  • Hql 一种错误写法的分析
  • nginx 405 not allowed问题的解决
  • Mac 与 PC 键盘布局对比
  • oracle 创建视图、修改视图、删除视图、利用视图操作基本表
  • 什么是基准测试?
  • 文件系统,快存储,对象存储
  • 图的基本概念
  • MySQL主从复制、搭建、状态检查、中断排查及备库重做
  • Java序列化 Seriallizable 和 Externalizable
  • 省级网站群建设关注点
  • linux 标准I/O (一)
  • script的defer
  • 网络编程释疑之:TCP连接拔掉网线后会发生什么
  • [iOS]Core Data浅析一 -- 启用Core Data
  • CAP 一致性协议及应用解析
  • css布局,左右固定中间自适应实现
  • Git同步原始仓库到Fork仓库中
  • Javascript 原型链
  • JSDuck 与 AngularJS 融合技巧
  • Mysql5.6主从复制
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 百度地图API标注+时间轴组件
  • 分布式事物理论与实践
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 搞机器学习要哪些技能
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 聊聊flink的TableFactory
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 排序(1):冒泡排序
  • 漂亮刷新控件-iOS
  • 如何解决微信端直接跳WAP端
  • 删除表内多余的重复数据
  • 微信小程序设置上一页数据
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 小程序01:wepy框架整合iview webapp UI
  • 写给高年级小学生看的《Bash 指南》
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (译) 函数式 JS #1:简介
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)创业家杂志:UCWEB天使第一步
  • (转)德国人的记事本
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net framework4与其client profile版本的区别
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .Net 垃圾回收机制原理(二)