前言

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. Janet Wu price

    上次也是第一次参加百公里是2012的时候,那年的主题是一路有你,和一群同事从深圳湾走到福田,最后累了就回家了,那晚应该是睡得很好吧. 今年是提前报名了,虽然还不确定是否参加.因为说实话,我不喜欢拥堵的 ...

  2. Ubuntu 16.04 PXE+kickstart部署系统

    #PXE+TFTP+Kickstart 自动部署服务器系统系统Ubuntu16.04apt-get install isc-dhcp-servervim /etc/default/isc-dhcp-s ...

  3. 在 React Native 中使用 moment.js 無法載入語系檔案

    moment.js 是很常見的日期時間 library,友善的 API 與極佳的執行效率是它的兩大賣點.例如 (new Date()).getFullYear(),如果使用 moment.js 我可以 ...

  4. 硬件小白学习之路(1)稳压芯片LM431

    图稳压芯片LM431简介 偶然的机会接触到LM431这个芯片,周末晚上打发无聊的时光,查资料进行剖析. LM431的Symbol Diagram和Functional Diagram如图1所示,下面分 ...

  5. USB小白学习之路(6) IIC EEPROM读取解析

    IIC EEPROM读取解析 1. 编译错误处理(这里可以忽略) 在解压包解压了程序后,直接编译,出现如下错误. *** WARNING L14: INCOMPATIBLE MEMORY MODEL ...

  6. OpenCV读一张图片并显示

    Java 版本: JavaCV 用OpenCV读一张图片并显示.只需将程序运行时的截图回复.如何安装配置创建项目编写OpenCV代码,可参考何东健课件和源代码或其他资源. package com.gi ...

  7. Nuts.js01

    1.简介 Vue ssr框架.支持vue2,vue-router,vuex,vue server render, vue meta 2.基本使用: vue init nuxt-community/ko ...

  8. 零基础JavaScript编码(二)

    任务目的 在上一任务基础上继续JavaScript的体验 学习JavaScript中的if判断语法,for循环语法 学习JavaScript中的数组对象 学习如何读取.处理数据,并动态创建.修改DOM ...

  9. 【,NetCore】WebApi使用统一时间格式

    1.在Startup中配置统一时间格式 services.AddMvc() .AddJsonOptions(options => { //配置时间序列化格式 options.Serializer ...

  10. UIButton左边图片右边文字的做法

    UIImage *yuyinImage = [UIImage imageNamed:@"yuyin.png"]; [soundButton setImage:yuyinImage ...