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

被折叠的 条评论
为什么被折叠?



