参考链接:https://blog.csdn.net/weixin_43780415/article/details/130498763

1、基本概念

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

也就是说,在我们去自己定义模板类的时候每个人往往有自己的习惯,导致我们代码想要的结果一样但编码五花八门,为了使我们遵循统一的标准,才有了STL

  • STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝连接。
  • STL 几乎所有的代码都采用了模板类或者模板函数

2、六大组件

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

1. 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
2. 算法:各种常用的算法,如sort、find、copy、for_each等
3. 迭代器:扮演了容器与算法之间的胶合剂。
4. 仿函数:行为类似函数,可作为算法的某种策略。
5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
6. 空间配置器:负责空间的配置与管理。

3、vector存放内置数据类型(遍历)

方法一: 
1 #include <vector>
2 #include<algorithm>
3 #include<iostream>
4 //容器 vector
5 //算法 for_each
6 //迭代器 vector<int>::iterator
7 using namespace std;
8
9 void test01() {
10
11 //创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
12 vector<int> v;
13 //向容器中放数据
14 v.push_back(10);
15 v.push_back(20);
16 v.push_back(30);
17 v.push_back(40);
18
19 //每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
20 //v.begin()返回迭代器,这个迭代器指向容器中第一个数据
21 //v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
22 //vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
23
24 vector<int>::iterator pBegin = v.begin();
25 vector<int>::iterator pEnd = v.end();
26
27 //第一种遍历方式:
28 while (pBegin != pEnd) {
29 cout << *pBegin << endl;
30 pBegin++;
31 }
32 }
33
34 int main()
35 {
36 test01();
37 system("pause");
38 return 0;
39 }
40

方法二:

 1 void test01() {
2
3 //创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
4 vector<int> v;
5 //向容器中放数据
6 v.push_back(10);
7 v.push_back(20);
8 v.push_back(30);
9 v.push_back(40);
10
11 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
12 cout << *it << endl;
13 }
14 }

方法三:

 1 #include <vector>
2 #include<algorithm>
3 #include<iostream>
4 //容器 vector
5 //算法 for_each
6 //迭代器 vector<int>::iterator
7 using namespace std;
8 void MyPrint(int val)
9 {
10 cout << val << endl;
11 }
12 void test01() {
13
14 //创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
15 vector<int> v;
16 //向容器中放数据
17 v.push_back(10);
18 v.push_back(20);
19 v.push_back(30);
20 v.push_back(40);
21
22 //第三种遍历方式:
23 //使用STL提供标准遍历算法 头文件 algorithm
24 for_each(v.begin(), v.end(), MyPrint);
25 }
26
27
28 int main()
29 {
30 test01();
31 system("pause");
32 return 0;
33 }
34

4、向量vector

1. 向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)

2. 数据结构很像一个数组,所以与其他容器相比,vector 能非常方便和高效访问单个元素,支持随机访问迭代子

3. 向量是动态结构,它的大小不固定,可以在程序运行时增加或减少

与数组不同,向量的内存用尽时,向量自动分配更大的连续内存区,将原先的元素复制到新的内存区,并释放旧的内存区;这是向量类的优点

vector 基本操作
(1)头文件
#include<vector> (2)创建vector对象
vector<int> vec; (3)尾部插入数字
vec.push_back(a); (4)使用下标访问元素
cout<<vec[0]<<endl; // 记住下标是从0开始的 (5)使用迭代器访问元素
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl; (6)插入元素
vec.insert(vec.begin()+i,a); // 在第i+1个元素前面插入a; (7)删除元素
vec.erase(vec.begin()+2); // 删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j); // 删除区间[i,j-1];区间从0开始 (8)向量大小
vec.size();
vec.resize; // 改变大小 (9)清空
vec.clear();

示例如下:

 1 #include <iostream>
2 #include <iomanip>
3 #include <vector> //包含向量容器头文件
4 using namespace std ;
5 void main(){
6 vector<int> A(10); //创建vector对象
7 int n;
8 int primecount = 0, i, j;
9 cout<<"Enter a value>=2 as upper limit: ";
10 cin >> n;
11 A[primecount++] = 2;//下标法访问元素
12 for(i = 3; i < n; i++){
13 if (primecount == A.size())
14 A.resize(primecount + 10); //改变容器大小
15 if (i % 2 == 0)
16 continue;
17 j = 3;
18 while (j <= i/2 && i % j != 0)
19 j += 2;
20 if (j > i/2) A[primecount++] = i;
21 }
22 for (i = 0; i<primecount; i++){//输出质数
23 cout<<setw(5)<<A[i];
24 if ((i+1) % 10 == 0) //每输出10个数换行一次
25 cout << endl;
26 }
27 cout<<endl;
28 }

5、列表list

链表主要用于存放双向链表,可以从任意一端开始遍历。链表还提供了拼接(splice)操作,将一个序列中的元素从插入到另一个序列中

对比:

元素的插入和删除操作对 list 而言尤为高效

与 vector 和 deque 相比,对元素的下标访问操作的低效是不能容忍的,因此 list 不提供这类操作

头文件:#include <list>
 1 #include <iostream>
2 #include <list>
3 using namespace std ;
4 int main(){
5 list<int> Link; //构造一个列表用于存放整数链表
6 int i, key, item;
7 for(i=0;i < 10;i++)// 输入10个整数依次向表头插入{
8 cin>>item;
9 Link.push_front(item);
10 }
11 cout<<“List: ”; // 输出链表
12 list<int>::iterator p=Link.begin();
13 while(p!=Link.end()){ //输出各节点数据,直到链表尾
14 cout <<*p << " ";
15 p++; //使P指向下一个节点
16 }
17 cout << endl;
18 cout << "请输入一个需要删除的整数: ";
19 cin >> key;
20 Link.remove(key);
21 cout << "List: "; // 输出链表
22 p=Link.begin(); // 使P重新指向表头
23 while(p!=Link.end()){
24 cout <<*p << " ";
25 p++; // 使P指向下一个节点
26 }
27 cout << endl;
28 }

STL初识的更多相关文章

  1. [C++提高编程] 2、STL初识

    文章目录 2 STL初识 2.1 STL的诞生 2.2 STL基本概念 2.3 STL六大组件 2.4 STL中容器.算法.迭代器 2.5 容器算法迭代器初识 2.5.1 vector存放内置数据类型 ...

  2. 学习:STL概念学习

    STL初识: 为了建立数据结构和算法的一套标准,诞生了STL STL基本概念: STL(Standard Template Library,标准模板库) STL 从广义上分为: 容器(containe ...

  3. C++ 进阶 模板和STL

    C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 模板的特点: 模板不可以直接使用,它只 ...

  4. c++ :STL

    基础知识 容器 容器就是一些模板类的集合,不同之处就是容器中封装的是数据结构 1.序列容器 主要有vector向量容器.list列表容器.deque双端队列容器 元素在容器中是无序的 2.排序容器 包 ...

  5. 传智播客C++视频学习笔记(5)

    #include <iostream> using namespace std; void swapInt(int& a, int& b) { int temp = a; ...

  6. C++ 提高编程

    目录 C++ 提高编程 一. 模板 1. 概念 2. 函数模板 2.1 函数模板语法 2.2 注意事项 2.3 普通函数和函数模板的区别 2.4 普通函数和函数模板的调用规则 2.5 模板的局限性 3 ...

  7. 05-STL

    Day01 笔记 1 STL概论 1.1 STL六大组件 1.1.1 容器.算法.迭代器.仿函数.适配器.空间配置器 1.2 STL优点 1.2.1 内建在C++编译器中,不需要安装额外内容 1.2. ...

  8. 初识C++ 中的STL

    首先,STL是指standard template library,即C++标准模板库,也叫泛型库. STL提供了三种类型的组件:容器,迭代器和算法,他们都支持泛型程序设计标准. (一)容器: 分为: ...

  9. 初识STL

    原生指针 泛型指针 智能指针 都是什么? iterator迭代器和指针的区别 C++标准模板库(STL)迭代器的原理与实现 [C++]STL常用容器总结之一:容器与迭代器 C++内置数组和array的 ...

  10. 初识STL vector

    写这个主要是当作笔记来写的,配上自己的理解加上一些测试示例; 上代码: #include<iostream>#include<cstring>#include<vecto ...

随机推荐

  1. 生长算法和巡中线算法python实现代码示例(自用)

    生长算法和巡中线算法python实现代码示例(自用) import cv2 import time import numpy as np from math import pi, isnan # PI ...

  2. 【非对称加密】详解及Java实现

    非对称加密详解及Java实现 一.非对称加密概述 非对称加密(Asymmetric Cryptography),也称为公钥加密,是一种使用一对密钥(公钥和私钥)进行加密和解密的加密方法.它与对称加密的 ...

  3. 直击运维痛点,大数据计算引擎 EasyMR 的监控告警设计优化之路

    当企业的业务发展到一定的阶段时,在系统中引入监控告警系统来对系统/业务进行监控是必备的流程.没有监控或者没有一个好的监控,会导致开发人员无法快速判断系统是否健康:告警的实质则是"把人当服务用 ...

  4. Claude Code 初体验 - Windows

    1. 前言 Cursor 和 Claude Code 都是编程神器,它们的主要区别是什么呢? Cursor 主要对不同的AI模型进行整合,提供友好的代码编辑体验,包括OpenAI 的 GPT 系列.G ...

  5. HyperWorks二维网格划分及拓扑改进

    Step 01:载入模型 Exercise_3a.hm. Step 02:2D 网格划分. (1) 进入 automesh 面板. 图 3-13 设置 automesh 面板网格控制参数 (2) 指定 ...

  6. AI应用实战课学习总结(5)回归分析预测实战

    大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第5站,一起了解下回归分析是什么 以及 通过回归模型预测电商用户的生命周 ...

  7. Rust 修仙之道

    静修Rust三年多,有所感悟.今借道家修仙之法展一斑之管窥,只为博大家一乐.进入正文

  8. Java MCP 实战:构建跨进程与远程的工具服务

    一.MCP 协议简介 MCP(Model Context Protocol,模型上下文协议)是由Anthropic推出的一种开放标准协议,旨在为大语言模型(LLM)与外部数据源.工具和服务提供标准化. ...

  9. 推荐 5 款实用的 Docker 可视化管理工具,工作效率翻倍!

    前言 经常有小伙伴问:有什么好用的 Docker 可视化管理工具推荐的吗?今天大姚给大家推荐 5 款实用的 Docker 可视化管理工具,选择一款适合自己的 Docker 可视化管理工具能够更方便地查 ...

  10. ble python 成功的例子 创建GATT服务 BLUEZ 5.47

    发现是偶然事件,正确的做法可能要修改bluez里面服务的注册方式,把ble的服务发现注册到sdp.具体做法不清楚.但是肯定要修改源码. 工欲善其事,必先利其器 使用未知的工具,现在一个良好的平台上走通 ...