前言

STL是C++的框架,然后vector容器和deque容器又是STL的一部分...

这块的内容都是理解、概念为主,没什么捷径,希望读者能静下来记。

先来讲vector容器(单端动态数组)

1、vector大小操作

size();返回容器中元素的个数。

empty();//判断容器是否为空

resize(int num);//重新制定容器的长度为num,若容器变长,则以默认值填充新位置(0),如果容器变短,则末尾超出容器长度的元素被删除。

resize(int num,elem);//重新制定容器的长度num,若容器边长,则以elem值填充新位置,如果容器变短,则末尾超出容器长>度的元素被删除。

capacity();//容器的容量。

reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

 void test02()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back(); if(v.empty())
{
cout<<"v容器为空"<<endl;
}
else
{
cout<<"容器非空"<<endl;
cout<<"size = "<<v.size()<<endl;
cout<<"capacity = "<<v.capacity()<<endl;
//容量 >= size
} printVectorInt(v);//10 20 30 40
//resize(int num);//重新指定容器的长度为num
//多出的部分 自动补0
v.resize();
printVectorInt(v);//10 20 30 40 0 0 0 0 //resize(int num, elem);//重新指定容器的长度为num,
//若容器变长,则以elem值填充
v.resize(,);
printVectorInt(v);//10 20 30 40 0 0 0 0 5 5 v.resize();
printVectorInt(v);//10 20
}

注意:resize 是作用于容器大小,不会更改容器容量。

2、使用resize、swap收缩容器的容量

 void test04()
{
vector<int> v;
for(int i=;i<;i++)
{
v.push_back(i);
}
cout<<"size = "<<v.size()<<endl;//
cout<<"capactiy = "<<v.capacity()<<endl;//1024 //使用reszie将空间 置成10个元素(可以吗?)
v.resize();//不能修改容量 只能修改size
cout<<"size = "<<v.size()<<endl;//
cout<<"capactiy = "<<v.capacity()<<endl;//1024 //使用swap收缩容器的容量
vector<int>(v).swap(v); cout<<"size = "<<v.size()<<endl;//
cout<<"capactiy = "<<v.capacity()<<endl;//
}

3、reserve预留空间大小

4、数据的存取

at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
 void test06()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back(); printVectorInt(v);//10 20 30 40
cout<<v[]<<endl;//
cout<<v.at()<<endl;//30
//[] 越界 不抛出异常
//at 越界 抛出异常 cout<<"front = "<<v.front()<<endl;//
cout<<"back = "<<v.back()<<endl;//
}

6、vector容器的插入和删除

insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素
 void test07()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
printVectorInt(v);//10 20 30 40 //insert(const_iterator pos, int count,ele);
//迭代器指向位置pos插入count个元素ele.
v.insert(v.begin()+,,);
printVectorInt(v);//10 20 100 100 100 30 40 //尾部删除:pop_back();//删除最后一个元素
v.pop_back();//将40删除了
printVectorInt(v);//10 20 100 100 100 30 //erase(const_iterator start, const_iterator end);
//删除迭代器从start到end之间的元素
v.erase(v.begin()+, v.end()-);
printVectorInt(v);//10 20 30 //erase(const_iterator pos);//删除迭代器指向的元素
v.erase(v.begin()+);//删除20的位置
printVectorInt(v);//10 30 cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl; //clear();//删除容器中所有元素
v.clear();
printVectorInt(v);//啥也没有
cout<<"size = "<<v.size()<<", capacity = "<<v.capacity()<<endl;
}

好了vector事例就是以上几点..现在来讲deque容器(双端动态数组)

1、deque容器的构造 和赋值

deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。
3.3.3.2 deque赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符
swap(deq);// 将deq与本身的元素互换
 void printDequeInt(deque<int> &d)
{
for(deque<int>::iterator it=d.begin();it!=d.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test01()
{
deque<int> d(,);
printDequeInt(d);//10 10 10 10 10 //assign(n, elem);//将n个elem拷贝赋值给本身。
deque<int> d1;
d1.assign(,);
printDequeInt(d1);//100 100 100 100 100 //deque& operator=(const deque &deq); //重载等号操作符
deque<int> d2;
d2 = d1;
printDequeInt(d2);//100 100 100 100 100 //swap(deq);// 将deq与本身的元素互换
deque<int> d3(,);
deque<int> d4(,);
printDequeInt(d3);//1 1 1 1 1
printDequeInt(d4);//2 2 2 2 2
d3.swap(d4);
printDequeInt(d3);//2 2 2 2 2
printDequeInt(d4);//1 1 1 1 1
}

2、deque容器的大小操作、双端插入删除操作、元素访问操作

3.3.3.3 deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
3.3.3.4 deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
3.3.3.5 deque数据存取
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
front();//返回第一个数据。
back();//返回最后一个数据
 void test02()
{
deque<int> d;
//尾部插入
d.push_back();
d.push_back();
d.push_back();//10 20 30 //头部插入
d.push_front();
d.push_front();
d.push_front();
printDequeInt(d);//60 50 40 10 20 30 //头部删除
d.pop_front();//50 40 10 20 30
//尾部删除
d.pop_back();//50 40 10 20
printDequeInt(d);//50 40 10 20 if(d.empty())
{
cout<<"d容器为空"<<endl;
}
else
{
cout<<"d容器非空"<<endl;
cout<<"size = "<<d.size()<<endl;//
} //[]访问第二个元素
cout<<"d[2] = "<<d[]<<endl;//
cout<<"d.at(2) = "<<d.at()<<endl;//
cout<<"头元素 = "<<d.front()<<endl;//
cout<<"尾元素 = "<<d.back()<<endl;//
}

3、容器的插入删除

3.3.3.6 deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
3.3.3.7 deque删除操作
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置
 void test03()
{
deque<int> d;
d.insert(d.begin(),, );
printDequeInt(d);//100 100 100 100 100 d.clear();
cout<<"size = "<<d.size()<<endl;//
}

5、srand设置随机种子 rand 产生随机数

 #include <iostream>
#include<time.h>
using namespace std; int main(int argc, char *argv[])
{
//设置随机数种子time(NULL)获取当前时间
srand(time(NULL)); for(int i=;i<; i++)
{
//rand()函数的返回值就是随机数
int num = rand();
cout<<num<<" ";
}
cout<<endl;
return ;
}

deque容器和vector容器最大的差异:

a、deque插入和删除 常数项时间(不会因为数据量的大小 改变操作所耗时)
b、deque容器没有容量的概念 以分段连续空间组成。
c、Deque是由一段一段的定量的连续空间构成。

STL vector容器 和deque容器的更多相关文章

  1. STL学习三:deque容器

    1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...

  2. C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器

    课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...

  3. 2.3 C++STL vector容器详解

    文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...

  4. STL顺序容器【vector】【deque】【list】

    我们都知道,stl在集装箱船分为两类,订购集装箱和相关的容器. 顺序容器有三种即动态数组vector,双端队列deque,以及链表list (对csdn的文字排版严重吐槽.写好的版发表了就变了) 一: ...

  5. C++——STL之vector, list, deque容器对比与常用函数

    STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...

  6. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  7. STL学习系列三:Deque容器

    1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...

  8. 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操 ...

  9. STL之Deque容器

    1.Deque容器 1)deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. 2)deque在接口上和vect ...

随机推荐

  1. Android APP性能及专项测试

    移动测试. Android测试 .APP测试 Android篇 1. 性能测试 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试 Android的a ...

  2. Opengl-法线贴图(用来细化表面的表现表现的凹凸)

    我们通过这张图可以看出来,使用了法线贴图的物体表面更有细节更逼真,其实这就是发现贴图的作用,没什么钻牛角尖的. 其实表面没有凹凸的情况是因为我们把表面一直按照平整来做的,要想突出这个表面的凹凸就要用到 ...

  3. android编译架构之添加C项目

    1.  增加一个项目与android编译中枢息息相关.特别需要告诉编译中枢的一些特别信息. 例如: A 这个项目target名字是什么 B 这个项目编译类型是什么,bin?c?lib?or jar? ...

  4. 内核ioctl函数的cmd宏参数

    在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...

  5. 当鼠标hover的时候,使用tip将overflow:hidden隐藏的文字显示完全

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 编写一个可复用的SpringBoot应用运维脚本

    前提 作为Java开发者,很多场景下会使用SpringBoot开发Web应用,目前微服务主流SpringCloud全家桶也是基于SpringBoot搭建的.SpringBoot应用部署到服务器上,需要 ...

  7. 达拉草201771010105《面向对象程序设计(java)》第四周学习总结

    实验四类与对象的定义及使用 实验时间 2018-9-20 第一部分:理论知识 1.类与对象概念 (1)类是具有相同属性和方法的一类事物的抽象,是构造对象的模板或蓝图,由类构造对象的过程称为创建类的实例 ...

  8. Thread同步

    今天本人给大家讲解一下多线程的线程同步,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 开始说线程同步前先来个小案例: 案例启:所有的类都在Demo01中, ...

  9. 设计模式之委派模式,大名鼎鼎的Spring都在用

    什么是委派模式 虽然说委派模式不属于Gof23中设计模式,但这并不影响它成为一种经典的设计模式. "委派"字面意思就是指派一件事情给某人.类比到生活中的场景,比如项目leader指 ...

  10. Learn Regex The Easy Way

    GitHub上的正则表达式在线学习Learn Regex The Easy Way,可以帮助初学者快速入门 该项目已汉化,可在线练习 地址:https://github.com/ziishaned/l ...