标准容器(一)顺序容器

文章详细介绍了C++中的三种容器——vector、deque和list的基本概念、构造函数、操作函数以及它们之间的区别。vector基于动态数组,适合尾部插入和删除,deque支持双端操作但内存非连续,而list采用双向链表实现,适合频繁的中间插入和删除。各种操作的时间复杂度也进行了对比。

目录

1. vector向量容器

2.deque双端队列 

3. list链表容器 

vector和deque之间的区别

vector和list之间区别:


1. vector向量容器

        底层:动态开辟的数组,每次 以原来空间大小的二倍进行扩容 内存连续。

构造函数:

vector<T> v;                      //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());       //将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);                  //构造函数将n个elem拷贝给本身。
vector(const vector &vec);        //拷贝构造函数。

操作函数:

push_back(ele); //尾部插入元素ele

pop_back(); //删除最后一个元素

insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele

insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele

erase(const_iterator pos); //删除迭代器指向的元素

erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素

clear();

insert erase 时间复杂度O(n)

查询:

at(int idx); //返回索引idx所指的数据

operator[]; //返回索引idx所指的数据

front(); //返回容器中第一个数据元素

back(); //返回容器中最后一个数据元素

常用方法:

size()
empty()
resize(20)  //扩容
swap  //交换

reserve(20)只给vector容器预留空间

2.deque双端队列 

        底层:动态开辟的二维数组

        动态开辟的二维数组空间,第二维是固定长度的数组空间,扩容的时候(第一维的数组进行2倍扩容 ,上下预留相同空行,方便deque双端元素 操作)deque底层内存不是连续的 每一个二维数组是连续的。

构造函数:

deque<T> deqT;                      //默认构造形式
deque(beg, end);                  //构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);                    //构造函数将n个elem拷贝给本身。
deque(const deque &deq);   //拷贝构造函数

操作函数:

两端插入操作: 时间复杂度O1

push_back(elem); //在容器尾部添加一个数据

push_front(elem); //在容器头部插入一个数据 

pop_back(); //删除容器最后一个数据

pop_front(); //删除容器第一个数据

指定位置操作: 时间复杂度On

insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

clear(); //清空容器的所有数据

erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

erase(pos); //删除pos位置的数据,返回下一个数据的位置。

查询:

t(int idx); //返回索引idx所指的数据

operator[]; //返回索引idx所指的数据

front(); //返回容器中第一个数据元素

back(); //返回容器中最后一个数据元素

<!--下面的容器就没有[]访问或at()访问每个字符的-->

常用方法:

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

deque.size(); //返回容器中元素的个数

deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除

3. list链表容器 

                底层:双向循环链表

构造函数:

list<T> lst;                               //list采用采用模板类实现,对象的默认构造形式:
list(beg,end);                           //构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem);                             //构造函数将n个elem拷贝给本身。
list(const list &lst);                    //拷贝构造函数。

操作:

        支持头插尾插,中间插入时间复杂度也是O1

push_back(elem);//在容器尾部加入一个元素

pop_back();//删除容器中最后一个元素

push_front(elem);//在容器开头插入一个元素

pop_front();//从容器开头移除第一个元素

insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。

insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。

insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。

clear();//移除容器的所有数据

erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。

erase(pos);//删除pos位置的数据,返回下一个数据的位置。

remove(elem);//删除容器中所有与elem值匹配的元素。

[remove]  这是与deque容器不同的地方

查询:

                链表查询比较花时间

常用方法:

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

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

resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

 deque和list比vector多出头插头删,

vector和deque之间的区别

1.底层的数据结构不同:

        vector底层是动态开辟的数据,内存连续,每次以原先二倍的方式扩容,vector 需要扩容时,它会先分配一个更大的内存空间,然后将原有的元素逐个拷贝到新的内存空间中,最后析构并释放原有的内存空间。

        deque是动态开辟的二维数组,第二维是固定长度的数组空间,扩容的时候(第一维的数组进行2倍扩容)deque底层内存不是连续的 每一个二维数组是连续的。

2. 前中后插入删除元素的时间复杂度不同:

        中间都是On的;前deque是O1,vector是On;后都是O1

3.内存的使用效率不同:

        vector使用的空间必须是连续的,deque可以分块存储数据,不需要内存空间必须连续

4.在中间进行insert和erase,两者效率谁更好

        时间复杂度都是On,但是vector内存连续,deque不连续,所以相对来说还是vector效率好。

vector和list之间区别:

1.底层的数据结构不同:

        动态开辟的数组,和双端循环链表

2.增删查时间复杂度不同:

        vector随机访问O1,list随机访问是On  ; 对于增加删除来说list是O1,vector是On,也就是说查询用vector,增删改查用list; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值