C++标准模板库

1. 标准模板库(Standard  Template  Labrory):STL

容器:

用于存放数据

顺序表

链表

队列

2. vetor(向量或数组)

使用该库的时候包含头文件:#include "vector"

vector向量是一个动态数组,可以根据实际需要去扩充向量(数组)的大小

C语言中的数组是一个静态数组,大小一旦给定,固定大小

vector也重载了数组相关的运算符,例如:[ ]

2.1 创建向量:

vector实质上是一个模板类

vector<T> vect1();//创建向量时空的向量
vector<T>vect2(int n);//创建向量时指定向量的大小,并且向量中的数据被初始化为0
vector<T>vect3(int n,T data);//创建向量时指定向量的大小,并且将向量中的数据初始化为data
vector vect4=vect3;//用一个向量来初始化另外一个向量	

方法:
vector<T>v1;     // 默认的初始化方式,内容为空
vector<T>v2(v1);   // v2是v1的一个副本
vector<T>v3(n, i)   // v3中包含了n个数值为i的元素
vector<T>v4(n);   // v4中包含了n个元素,每个元素的值都是0

2.1.1 举例

STL.cpp
#include "iostream"
#include "vector"
using namespace std;

//vector的创建
int main() 
{
	//1. 使用初始化列表创建向量
	vector<int> myVector = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < myVector.size();i++) {
		cout << myVector[i] << " ";
	}

	cout << endl;
	//2. 创建一个具有5个元素的向量,每个元素都初始化为0
	vector<int> myVector2(5);
	for (int i = 0; i < myVector2.size(); i++) {
		cout << myVector2[i] << " ";
	}

	cout << endl;
	//2. 创建一个具有5个元素的向量,每个元素都初始化为1
	vector<int> myVector3(5, 1);
	for (int i = 0; i < myVector3.size(); i++) {
		cout << myVector3[i] << " ";
	}

	cout << endl;
	//3. 从已有向量创建新向量 方式1
	vector<int> newVector(myVector3);
	for (int i = 0; i < newVector.size(); i++) {
		cout << newVector[i] << " ";
	}

	cout << endl;
	//3. 从已有向量创建新向量 方式2
	vector<int> newVector2 = myVector3;
	for (int i = 0; i < newVector2.size(); i++) {
		cout << newVector2[i] << " ";
	}

	return 0;
}

2.2 向量的遍历

STL.cpp
//vector的遍历
int main()
{
	//实例化vector类,并且具备10个大小
	vector<int> 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 <<vect1[i] << " ";
	}

	cout << endl;
	cout << endl;
	//方法二,采用at()方法遍历
	for (int i = 0; i < vect1.size(); i++) {
		cout << vect1.at(i) << " ";
	}

	cout << endl;
	cout << endl;
	//方法三,采用迭代器遍历  iterator迭代器
	vector<int>::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;
}

2.3 vector向量的函数

2.3.1 vector常用函数

empty():判断向量是否为空,为空返回真,否则为假

begin():返回向量(数组)的首元素地址

end(): 返回向量(数组)的末元素的下一个元素的地址

clear():清空向量

front():返回得到向量的第一个元素的数据

back():返回得到向量的最后一个元素的数据

size():返回得到向量中元素的个数

push_back(数据):将数据插入到向量的尾部

pop_back():删除向量尾部的数据 

2.3.2 增加函数:

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)间的数据

2.3.3 删除函数:

iterator erase(iterator it):删除向量中迭代器指向元素

iterator erase(iterator first,iterator last):删除向量中[first,last)中元素

void pop_back():删除向量中最后一个元素

void clear():清空向量中所有元素

2.3.4 迭代器:

迭代器实质上也是一个类,在向量、队列中都存在迭代器,重载了指针的运算符:*、->、++、--等等

2.3.5 举例

STL.cpp
//vector函数的使用
int main()
{
	vector<int> vect1 = {1,2,3,4,5,6}; //实例化vector类,并且具备10个大小,每个数据初始为1
	//采用迭代器遍历  iterator迭代器
	vector<int>::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<int>::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<int>::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;
}

3. list(链表)

链表:

是不能随机访问,不能向数组一样随机访问链表中的数据

例如:不能通过符号“[]”、at运算符访问链表中的数据元素

3.1 初始化list对象的方式

list L0;    //空链表

list L1(3);   //建一个含三个默认值是0的元素的链表

list L2(5,2); //建一个含五个元素的链表,值都是2

list L3(L2); //L3是L2的副本

list L4(L1.begin(),L1.end());    //L4L1区域的元素[begin, end]。

3.2 list常用函数

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():将链表排序,默认升序

4. 队列(deque)

4.1 初始化对象

1. deque<T> deq; //默认构造形式

2. deque<T> d2(d1.begin(),d1.end()); //将d1中[begin,end)区间中的元素拷贝给本身。

3. deque(n,elem);  //构造函数将n个elem拷贝给本身

4. deque(const deque &deq);  //拷贝构造函数

4.2 常用函数

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(); //返回容器中最后一个数据元素

相关推荐

  1. C++标准模板(STL)- 算法

    2024-01-05 12:46:04       70 阅读
  2. C++——STL标准模板——容器详解——vector

    2024-01-05 12:46:04       30 阅读
  3. C++——STL标准模板——容器详解——deque

    2024-01-05 12:46:04       24 阅读
  4. C++——STL标准模板——容器详解——set

    2024-01-05 12:46:04       33 阅读
  5. C++ 的标准模板(STL)常用算法介绍

    2024-01-05 12:46:04       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-05 12:46:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-05 12:46:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-05 12:46:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-05 12:46:04       20 阅读

热门阅读

  1. 中间件:构建现代软件架构的桥梁

    2024-01-05 12:46:04       33 阅读
  2. merge发生冲突时 ☞ 撤销merge

    2024-01-05 12:46:04       43 阅读
  3. WiFi7: MLD寻址

    2024-01-05 12:46:04       43 阅读
  4. redis总结

    2024-01-05 12:46:04       42 阅读
  5. .NET C# 如何获取object对象的数据

    2024-01-05 12:46:04       30 阅读
  6. CSS中变量的作用

    2024-01-05 12:46:04       38 阅读
  7. Linux 服务器安全策略技巧:网络分段

    2024-01-05 12:46:04       32 阅读
  8. 路由的安装顺序

    2024-01-05 12:46:04       44 阅读
  9. Go语言中的乐观锁与悲观锁

    2024-01-05 12:46:04       46 阅读