容器:
用于存放数据
顺序表
链表
队列
使用该库的时候包含头文件:#include "vector"
vector向量是一个动态数组,可以根据实际需要去扩充向量(数组)的大小
C语言中的数组是一个静态数组,大小一旦给定,固定大小
vector也重载了数组相关的运算符,例如:[ ]
vector实质上是一个模板类
vector vect1();//创建向量时空的向量
vectorvect2(int n);//创建向量时指定向量的大小,并且向量中的数据被初始化为0
vectorvect3(int n,T data);//创建向量时指定向量的大小,并且将向量中的数据初始化为data
vector vect4=vect3;//用一个向量来初始化另外一个向量
方法:
vectorv1; // 默认的初始化方式,内容为空
vectorv2(v1); // v2是v1的一个副本
vectorv3(n, i) // v3中包含了n个数值为i的元素
vectorv4(n); // v4中包含了n个元素,每个元素的值都是0
#include "iostream"
#include "vector"
using namespace std;
//vector的创建
int main()
{
//1. 使用初始化列表创建向量
vector myVector = { 1, 2, 3, 4, 5 };
for (int i = 0; i < myVector.size();i++) {
cout << myVector[i] << " ";
}
cout << endl;
//2. 创建一个具有5个元素的向量,每个元素都初始化为0
vector myVector2(5);
for (int i = 0; i < myVector2.size(); i++) {
cout << myVector2[i] << " ";
}
cout << endl;
//2. 创建一个具有5个元素的向量,每个元素都初始化为1
vector myVector3(5, 1);
for (int i = 0; i < myVector3.size(); i++) {
cout << myVector3[i] << " ";
}
cout << endl;
//3. 从已有向量创建新向量 方式1
vector newVector(myVector3);
for (int i = 0; i < newVector.size(); i++) {
cout << newVector[i] << " ";
}
cout << endl;
//3. 从已有向量创建新向量 方式2
vector newVector2 = myVector3;
for (int i = 0; i < newVector2.size(); i++) {
cout << newVector2[i] << " ";
}
return 0;
}
//vector的遍历
int main()
{
//实例化vector类,并且具备10个大小
vector vect1 = {1,2,3,4,5,6,7,8,9,10};
//求vector大小
cout << "vector的大小" << vect1.size() << endl;
cout << endl;
//遍历
//方法一,采用数组形式
for (int i = 0; i < vect1.size();i++) {
cout <::iterator ite = vect1.begin(); //begin()方法返回容器的第一个元素的地址
for (; ite != vect1.end();ite++) {//end() 方法返回的迭代器指向容器尾部的下一个位置(即超过容器范围的位置)
cout << *ite << " ";
}
cout << endl;
cout << endl;
//判空
if (!vect1.empty()) {
cout << "vect1不为空" << endl;
}
//获取头部数据
cout<<"头部数据" << vect1.front() << endl;
cout << endl;
//获取尾部数据
cout << "尾部数据" << vect1.back() << endl;
//清空模板
vect1.clear();
return 0;
}
empty():判断向量是否为空,为空返回真,否则为假
begin():返回向量(数组)的首元素地址
end(): 返回向量(数组)的末元素的下一个元素的地址
clear():清空向量
front():返回得到向量的第一个元素的数据
back():返回得到向量的最后一个元素的数据
size():返回得到向量中元素的个数
push_back(数据):将数据插入到向量的尾部
pop_back():删除向量尾部的数据
void push_back(const T& x):向量尾部增加一个元素X
iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素
迭代器实质上也是一个类,在向量、队列中都存在迭代器,重载了指针的运算符:*、->、++、--等等
//vector函数的使用
int main()
{
vector vect1 = {1,2,3,4,5,6}; //实例化vector类,并且具备10个大小,每个数据初始为1
//采用迭代器遍历 iterator迭代器
vector::iterator ite = vect1.begin(); //begin()方法返回容器的第一个元素的地址
for (; ite != vect1.end();ite++) {//end() 方法返回的迭代器指向容器尾部的下一个位置(即超过容器范围的位置)
cout << *ite << " ";
}
cout << endl;
cout << endl;
//在向量尾部插入数据
vect1.push_back(30);
vect1.push_back(40);
vect1.push_back(50);
vect1.push_back(60);
for (auto ret:vect1) {//auto 是新特性,可以接收任何类型
cout << ret << " ";
}
cout << endl;
cout << endl;
//删除尾部数据
vect1.pop_back();
for (auto ret : vect1) {//auto 是新特性,可以接收任何类型
cout << ret << " ";
}
//在指定位置插入数据
// ite 这个迭代器在 vect1.push_back(30); 后已经失效了。
//当使用 push_back 后,如果发生了动态内存的重新分配,迭代器 ite 就可能失效,因为重新分配会导致之前的迭代器不再指向有效的位置。
//vect1.insert(ite, 80);
//在指定位置插入数据
vector::iterator ite3 = vect1.begin();
vect1.insert(ite3, 80);//表示在ite3迭代器指向的位置之前插入数据
//begin() 返回的是一个迭代器,它指向容器的第一个元素
auto it = vect1.begin()+2;//在下标为2的位置,即第三个位置前插入
vect1.insert(it, 90);
cout << endl;
cout << endl;
for (auto ret : vect1) {//auto 是新特性,可以接收任何类型
cout << ret << " ";
}
//删除指定位置的数据
vector::iterator ite4 = vect1.begin();
vect1.erase(ite4);//删除第一个数据
auto it2 = vect1.begin() + 5;//删除第六个数据
vect1.erase(it2);
cout << endl;
cout << endl;
for (auto ret : vect1) {//auto 是新特性,可以接收任何类型
cout << ret << " ";
}
return 0;
}
链表:
是不能随机访问,不能向数组一样随机访问链表中的数据
例如:不能通过符号“[]”、at运算符访问链表中的数据元素
list L0; //空链表
list L1(3); //建一个含三个默认值是0的元素的链表
list L2(5,2); //建一个含五个元素的链表,值都是2
list L3(L2); //L3是L2的副本
list L4(L1.begin(),L1.end()); //L4含L1区域的元素[begin, end]。
begin():返回list容器的第一个元素的地址
end():返回list容器的最后一个元素之后的地址
rbegin():返回逆向链表的第一个元素的地址(也就是最后一个元素的地址)
rend():返回逆向链表的最后一个元素之后的地址(也就是第一个元素再往前的位置)
front():返回链表中第一个数据值
back():返回链表中最后一个数据值
empty():判断链表是否为空
size():返回链表容器的元素个数
clear():清除容器中所有元素
insert(pos,num):将数据num插入到pos位置处(pos是一个地址)
insert(pos,n,num):在pos位置处插入n个元素num
erase(pos):删除pos位置处的元素
push_back(num):在链表尾部插入数据num
pop_back():删除链表尾部的元素
push_front(num):在链表头部插入数据num
pop_front():删除链表头部的元素
sort():将链表排序,默认升序
1. deque
2. deque
3. deque(n,elem); //构造函数将n个elem拷贝给本身
4. deque(const deque &deq); //拷贝构造函数
5. deque& operator=(const deque &deq); //重载等号操作符
6. assign(beg, end); //将[beg,end)区间中的数据拷贝赋值给本身。
7. assign(n,elem); //将n个elem拷贝赋值给本身。
8. empty(); //判断容器是否为空
9. size(); //返回容器中的元素的个数
10. resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
11. resize(num,elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位 置。
//如果容器变短,则末尾超出容器长度的元素被删除。
12. push_back(elem); //在容器尾部添加一个数据
13. push_front(elem); //在容器头部插入一个数据
14. pop_back(); //删除容器最后一个数据
15. pop_front(); //删除容器第一个数据
16. insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
17. insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
18. insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
19. clear(); //清空容器的所有数据
20. erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
21. erase(pos); //删除pos位置的数据,返回下一个数据的位置。
22. at(int idx); //返回索引idx所指的数据
23. front(); //返回容器中第一个数据元素
24. back(); //返回容器中最后一个数据元素