c++ STL--容器 (第一部分)

C++ STL--容器 (第一部分)

一.STL

1.关于STL的一些知识

1.STL的全称为:Standard Template Library

2.STL中文名为标准模板库

3.STL是c++标准库的一部分,是以源代码的形式提供的

4.STL体现了泛型编程的思想 (可以对不同的数据类型进行操作)

5.STL的头文件都不加扩展名,并且需要打开std命名空间

2.STL的六大组件

1.容器

2.迭代器

3.算法

4.容器适配器

5.空间分配器

6.仿函数

二.容器

1.容器分为两大类

1.序列性容器:

​ 元素保持了在容器中的原始位置,允许指定位置插入、删除,每个元素都有固定的位置,取决于插入的时间、地点,与元素的值无关 例如 list容器

2.关联性容器:

​ 元素的位置取决于容器的特定排序规则,一般与元素的值有关 例如map容器

2.list容器(序列性容器)

1.特点

list在任一一个位置增加删除元素效率都不变 时间复杂度为O(1)

但是查找效率为O(n)

2.使用的头文件为

c++ 复制代码
#include<list>
using namespace std;//需要打开std命名空间

3.关于list容器一些功能的使用

我们用模版T实例化为int类型的链表来进行功能的测试
1.创建链表
c++ 复制代码
list<int> //创建链表
list<int> lst(5);//创建链表 并指定链表长度
list<int> lst(5,4);//指定链表长度,且指定了初始化
list<int>  lst{ 1,2,3,4,5 };//使用初始化列表 进行显示的指定
2.将链表中的对应值的节点移除
c++ 复制代码
list<int> lst.remove(2);//将链表中值为2的节点移除
3.将连续且相同的节点移除只剩一个
c++ 复制代码
lst.unique();
4.链表的遍历
1.迭代器遍历
c++ 复制代码
list<int>::iterator ite = lst.begin();	
while (ite != lst.end()) {//lst.end()是一个无效节点,是有效节点的下一个
	cout << *ite << "   ";
	ite++;
}
2.范围遍历
c++ 复制代码
for (int v : lst) cout << v << "   ";
5.链表的排序排序
1.升序
c++ 复制代码
//第一种
list<int> lst2{ 2,8,6,4,7,9,1 };
lst2.sort();//默认升序
for (int v : lst2) cout << v << "   ";//遍历一下

//第二种
bool rule_asc(int a, int b) {
	return a < b;
}

lst2.sort(&rule_asc);//指定规则:升序
	for (int v : lst2) cout << v << "   ";//遍历一下

//第三种
lst2.sort(less<>());//升序,用写好的升序规则
	for (int v : lst2) cout << v << "   ";//遍历一下
2.降序
c++ 复制代码
//第一种
bool rule_desc(int a,int b) {
	return a > b;
}

lst2.sort(&rule_desc);//指定规则:降序
	for (int v : lst2) cout << v << "   ";//遍历一下

//第二种
lst2.sort(greater<>());//降序,用写好的降序规则
	for (int v : lst2) cout << v << "   ";//遍历一下
6.链表的翻转
c++ 复制代码
lst2.reverse();
7.链表的剪切
c++ 复制代码
list<int> lst3{ 5,2,0 };

list<int>::iterator ite = lst2.begin();//迭代器找位置
::advance(ite, 3);//迭代器做偏移,支持正向,反向偏移

//第一种方式
lst2.splice(ite, lst3);//剪切,第一个参数是位置(被剪切的链表要插入到这个位置之前),第二个参数是被剪切的链表
for (int v : lst2) cout << v << "   ";//遍历一下

//第二种方式
lst2.splice(ite, lst3, lst3.begin());//剪切 某一个节点
for (int v : lst2) cout << v << "   ";//遍历一下

//第三种方式
lst2.splice(ite, lst3, lst3.begin(),--lst3.end());//剪切 某一段链表中的节点
for (int v : lst2) cout << v << "   ";//遍历一下
8.链表的合并(两个链表必须有序且同顺序才能合并)
c++ 复制代码
//合并后升序
lst2.sort();
lst3.sort();
lst2.merge(lst3);//合并,合并完是升序
for (int v : lst2) cout << v << "   ";//遍历一下

//合并后降序
lst2.sort(greater<>());
lst3.sort(greater<>());
lst2.merge(lst3,greater<>());//合并,合并完是升序,所以进行一个降序规则的指定
for (int v : lst2) cout << v << "   ";//遍历一下
9.交换两个链表
c++ 复制代码
lst2.swap(lst3);//交换
for (int v : lst2) cout << v << "   ";//遍历一下
for (int v : lst3) cout << v << "   ";//遍历一下
相关推荐
Wadli37 分钟前
C++语法 | static静态|单例模式
开发语言·c++·单例模式
_不会dp不改名_1 小时前
leetcode_21 合并两个有序链表
算法·leetcode·链表
进击的_鹏1 小时前
【C++11】initializer_list列表初始化、右值引用和移动语义、可变参数模版等
开发语言·c++
tongsound2 小时前
igh ethercat 实时性测试
linux·c++
睡不醒的kun2 小时前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
晚云与城2 小时前
今日分享:C++ deque与priority_queue
开发语言·c++
lingran__2 小时前
速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)
c++·算法
Humbunklung3 小时前
unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
c++·stl·mfc
爱编程的化学家4 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
眠りたいです5 小时前
基于脚手架微服务的视频点播系统-数据管理与网络通信部分的预备工作
c++·qt·ui·微服务·云原生·架构·媒体