cpp笔记07:STL

news2024/9/23 19:26:46

STL

基本概念

STL(Standard Template Library,标准模板库)

STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)

容器算法之间通过迭代器进行无缝连接

STL几乎所有代码都采用了模板类或者模板函数

六大组件

容器,算法,迭代器,仿函数,适配器,空间配置器

1.容器:各种数据结构,如vector,list,deque,set,map等,用来存放数据

2.算法:各种常用算法,如sort,find,copy,for_each等

3.迭代器:扮演了容器与算法间的胶合剂

4.仿函数:行为类似函数,可作为算法的某种策略

5.适配器:一种用来修饰容器或者仿函数或迭代器接口的东西

6.空间配置器:负责空间的配置与管理

容器

常用数据结构:数组,链表,树,栈,队列,集合,映射表等

这些容器分为序列式容器关联式容器两种:

序列式容器:强调值的排序

关联式容器:二叉树结构,各元素见没有严格的物理上的顺序关系

算法

分为:质变算法非质变算法

质变算法:运算过程中会更改元素内容

非质变算法:不会改变

迭代器

提供一种方法,使之能够依序寻访某个容器所含的各个元素,又无需暴露该容器的内部表示方式。

每个容器都有自己专属的迭代器

容器

vector

初识

void myPrint(int val) {
    cout<<val<<endl;
}
void test() {
    vector<int> v; //创建vector容器
    //向容器中插入数据
    v.push_back(10);
    v.push_back(20);

    //通过迭代器访问容器中的数据
    //初学时可以把迭代器看成是指针
    vector<int>::iterator itBegin = v.begin(); //起始迭代器指向容器中第一个元素
    vector<int>::iterator itEnd = v.end(); //结束迭代器指向容器最后一个元素的下一个位置
    //第一种遍历方式
    while(itBegin!=itEnd) {
        cout<<*itBegin<<endl;
        itBegin++;
    }
    //第二种遍历方式
    for(vector<int>::iterator it = v.begin();it!=v.end;it++) {
        cout<<*it<<endl;
    }
    //第三种遍历方式
    //STL遍历算法
    for_each(v.begin(),v.end(),myPrint); //回调myPrint
}

vector数据结构与数组非常相似,也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:找一块更大的内存空间将原数据拷贝到新空间,释放原空间

常用方法
构造函数

vector<T> v,vector(v.begin,v.end) 将v[begin(),end())这个区间中的元素拷贝,vector(n,elem)将n个elem拷贝,vector(vec)拷贝构造

赋值

vector1=vector2;vector.assign(v.begin(),v.end())

容量和大小

vector.empty()     判断容器是否为空

vector.capacity()  返回容器容量

vector.size()        返回容器中元素个数

vector.resize()     重新指定容器长度,若容器变长以默认值填充新位置,若变短则末尾长处容器长度的元素删除

插入和删除

vector.push_back()           尾部插入元素

vector.pop_back()             删除最后一个元素

vector.insert(iterator,ele)   迭代器指向位置添加元素        

vector.erase(iterator)        删除迭代器指向的元素

vector.clear()                     删除容器中所有元素

数据存取

vector.at();vector[];vector.front() 返回第一个元素;vector.back()返回最后一个

互换容器

vector.swap(vec) vector与vec元素互换

用途:巧用swap可以收缩内存空间

预留空间

vector.reserve(len)  容器预留len个元素长度,预留位置不初始化,元素不可访问

用途:减少vector在动态拓展容量时的拓展次数

string

string和char*的区别

char*是一个指针,string是一个类,类内部封装了char*,管理这个字符串,是一个char*型容器。

常用方法
赋值

string = "",string.assign()

字符串拼接

string += "",string.append()

查找和替换

string.find(),string.rfind()

find是从左往右找,rfind是从右往左找

string.replace(start,n,s)s中从start开始的n个字符换为s

字符串比较

按字符串的ASCII码进行比较

=返回0,>返回1,<返回-1

string.compare()

字符串存取

string[],string.at()

插入删除

string.insert()

string.erase()

子串

string.substr(start,number)

deque

双端数组,可以对头和尾进行插入删除

与vector的区别:vector对于头部的插入删除效率低,deque相对而言对头部的插入删除速度比vector块,vector访问元素时的速度会比deque块,这和两者的内部实现有关

常用方法
构造函数

类似vector 

deque<T>deq; deque<T>deq(iterator1,iterator2);deque<T>deq(number,element);

deque<T>deq(deq2)

赋值

deque1=deque2;deque.assign()

容器和大小

deque.empty();deque.size();deque.resize()

deque没有容量的概念

插入和删除

deque.push_back();deque.push_front()头插;deque.pop_back();deque.pop_front头删

deque.insert();deque.clear();deque.erase()

数据存取

deque[];deque.at();deque.front();deque.back()

排序操作

sort(iterator1,iterator2)根据迭代器对区间元素进行排序

用的时候要包含头文件algorithm

小练习

//有5名选手ABCDE。10个评委分别对每一名选手打分,去最高最低,取平均
class Person {
public:
    Person(string name,int score) {
        this->name = name;
        this->score = score;
    }
    string name;
    int score;
};
void createPerson(vector<Person>&g) {
    string nameSeed = "ABCDE";
    for(int i=0;i<5;i++) {
        string name = "选手";
        name += nameSeed[i];

        int score = 0;

        Person p(name,score);
        g.push_back(p);
    }
}
void setScore(vector<Person> &g) {
    for(vector<Person>::iterator i=g.begin();i<g.end();i++) {
        //将评委的分数放到deque
        deque<int> d;
        for(int i=0;i<10;i++) {
            int score=rand()%41+60; //60-100
            d.push_back(score);
        }
        sort(d.begin(),d.end());
        d.pop_back();
        d.pop_front();
        int sum = 0;
        for(deque<int>::iterator i=d.begin();i<d.end();i++) {
            sum += *i;
        }
        i->score = sum/d.size();
    }
}

stack

概念:一种先进后出(first in last out,FILO)的数据结构,它只有一个出口

因为只有顶端元素才可被外界使用,所以栈不允许有遍历行为

常用方法
构造函数

stack<T>;stack(stk)

赋值

stack1=stack2

数据存取

push() 向栈顶存数据;pop() 从栈顶移除第一个元素;top() 返回栈顶元素

大小操作

empty() 判断堆栈是否为空;size() 返回栈的大小

queue

概念:queue是一种先进先出(First in First out,FIFO)的数据结构,有两个出口

队尾只能进数据,队头只能出数据

只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为

常用方法
构造函数

queue<T> que;queue(que);

赋值

que1=que2

数据存取

push(ele) 往队尾添加ele;pop() 从队头移除一个元素;back() 返回队尾元素;front() 返回队头元素

大小操作

empty() 判断堆栈是否为空 size() 返回栈的大小

list(链表)

功能:将数据进行链式存储

数据域存放数据,指针域存放下一个数据的地址。方便对任意位置进行快速插入或删除元素

但是遍历速度没有数组块,占用空间比数组大

STL中的list是双向循环链表,前面数据的地址也存。最后一个节点的下一个节点地址记录的是第一个节点的地址,第一个节点记录的上一个节点的地址是最后一个节点的地址(与图片不符

list的迭代器只支持前移和后移属于双向迭代器

常用方法
构造函数

list<T> lst ; list(iterator1,iterator2) ; list(n,element) ; list(list1)

赋值和交换

list.assign(iterator1,iterator2);list.assign(n,elem)

list1 = list2;

list.swap(lst)  与lst元素互换

大小操作

list.size() ; list.empty() ; list.resize();

插入和删除

list.push_back(); list.pop_back() ; list.push_front() ; list.pop_front() ;

list.insert(pos,ele) ; list(pos,n,ele) ; list(pos,iterator1,iterator2) 插入数据在pos位置

list.clear(); list.erase(iterator1,iterator2) ; list.erase(pos) ;

list.remove(elem) 删除容器中所有与elem值向匹配的元素

数据存取

不可以用[ ]访问

list.front(); 返回第一个元素

list.back(); 返回最后一个元素

反转和排序

list.reverse(); 反转

list.sort(); 排序    sort(iterator1,iterator2)用不了 

所有不支持随机访问迭代器的容器,不可以用标准算法

set/multiset

所有元素都会在插入时自动被排序,属于关联式容器,底层结构是用二叉树实现

两者区别:set不允许有重复元素,multiset允许有重复元素

常用方法
构造函数
赋值
添加数据

set.insert()

大小和交换

set.empty() ; set.swap(set1) ; set.size();

删除

set.clear();set.erase()

查找和统计

set.find(ele) ; 查找ele元素是否存在若存在返回该元素的迭代器;不存在返回set.end()

set.count(ele) ; 统计ele元素的个数

排序

set默认从小到大排序,利用仿函数可以改变排序规则

//仿函数:是一个定义了一个含有重载()函数的类
class MyCompare {
public:
    bool operator()(int v1,int v2) const {
        return v1>v2;
    }
};

void test01() {
    //指定排序规则从大到小
    set<int,MyCompare> s2;   //在插入数据之前就要指定好排序规则 利用仿函数
    s2.insert(10);
    s2.insert(40);
    s2.insert(20);
    s2.insert(50);
    s2.insert(30);
    for(set<int,MyCompare>::iterator i=s2.begin();i != s2.end();i++) {
        cout<< *i << "";
    }
}
map/multimap

map中所有元素都是pair,pair的第一个元素为key,第二个元素为value。所有元素都会根据元素的键值自动排序。是关联式容器,底层用二叉树实现。

map不允许有重复key元素,multimap允许

常用方法
构造函数

map<T1,T2> m ;map<>m1(m2)

大小和交换

map.empty();map.size();map.swap()

插入和删除

map.insert(pair<T1,T2>(t1,t2))     

map.insert(make_pair(a,b))

//pair<T1,T2> 对组   获取第一个元素用 pair.first()第二个用pair.second()

map.clear();

map.erase(iterator) ;map.erase(iterator1,iterator2);map.erase(key)  

查找和统计

map.find(key)

map.count(key)

排序

map.sort()   //同样要修改排序规则利用仿函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8.7 Day15 匿名用户访问FTP与日志查看

查看配置文件 vsftpd是一个认证文件&#xff0c;意味着ftp是通过vsftpd这个认证文件来对我们输入的用户名和密码进行认证的&#xff0c;那么这个认证文件在哪里呢&#xff1f; 所在位置如下&#xff1a; 查看文件配置内容 默认通过系统来验证&#xff0c;但现在我们欲做一个类…

web自动化7-pytest④实践测试用例-回归用例web自动化部分代码

文档说明: 本文档包括web自动化目录结构代码元素定位 : 父级, 同级后面, 同级div, 包含, 不包含, 鼠标右键, 悬停, 句柄切换(浏览器切换,关闭), 不可见元素查找, 滑动到不可见元素出现, 悬停后点击, 页面有值判断, 页面数据量判断web自动化: 前置, 后置事件 结合上篇文章, 基本…

Django—模板继承和包含

模块的继承意义&#xff1a;将需要多次用到的内容&#xff08;盒子&#xff09;进行引用&#xff0c;减少代码的重复使用 如我们经常在网上看见的导航栏&#xff0c;页脚等 第一步&#xff1a;我们将继承模块写在一个html文件里面 第二步&#xff1a;创建一个html文件&#x…

【归并排序/快排/堆排序】912. 排序数组

力扣连接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 归并排序 对左右子集合分别排序&#xff0c;然后合并两个有序数组 class Solution {int[] nums;public int[] sortArray(int[] nums) {this.nums nums;return sort(0, nums.length-1);}int[] sort(int st, i…

电机学前置知识

https://zhuanlan.zhihu.com/p/712393024 基本定律 全电流定律&#xff08;安培环路定律&#xff09; 在磁场中沿任意闭合回路磁场强度的线积分等于穿过该回路所有电流的代数和&#xff0c;即&#xff1a; ∮ H ⋅ d l ∮ J ⋅ d s \oint H \cdot dl \oint J \cdot ds ∮H…

Windows 11下RTX 4090深度学习及大模型微调环境安装指南

在安装深度学习及大模型微调环境时&#xff0c;经历了多次反复操作&#xff08;如CUDA、cuDNN、PyTorch的安装与卸载&#xff09;。为了避免走弯路&#xff0c;总结了以下步骤&#xff1a; 步骤 1&#xff1a;显卡驱动安装 首先在安装完Windows 11后&#xff0c;安装RTX 4090显…

C++——类模板经典案例——自定义通用数组类

案例&#xff1a;自定义数组类 需求&#xff1a; 1&#xff0c;对内置数据及自定义数据类型的数据存储 2&#xff0c;将数组中的数据存储到堆区 3&#xff0c;构造函数中可以存入数组的容量 4&#xff0c;提供对应的拷贝构造函数和运算符重载防止浅拷贝问题的发生 5&#xff0c…

户外上网黑科技|300~500元随身wifi测评推荐,华为vs格行vs中兴vs上赞,哪个好?

1.老牌国货&#xff0c;颜值担当——华为 设备价格&#xff1a;499元 套餐价格&#xff1a;99一个月 599一年 质保时间&#xff1a;1年 测评&#xff1a;网速大概在50~60M/S&#xff0c;华为是老牌国货了&#xff0c;设备上没有硬伤&#xff0c;家里连接多设备都没什么问…

小怡分享之Java中的异常

前言&#xff1a; &#x1f308;✨之前小怡带大家认识了String类&#xff0c;今天小怡给大家分享Java中的异常。 1.异常的概念与体系结构 1.1 异常的概念 在日常开发中&#xff0c;绞尽脑汁将代码写的尽善尽美&#xff0c;在程序运行中&#xff0c;难免会出现一些奇奇怪怪…

Python学习(2):在单机机器学习,使用Dask实现鸢尾数据集 Iris 的分类任务

目录 一、源码来源 二、鸢尾花数据集的品种分类 1、数据处理步骤 &#xff08;1&#xff09;数据集加载 &#xff08;2&#xff09;准备特征和标签 &#xff08;3&#xff09;训练集和测试集划分 2、安装必需的软件包 3、运行程序 三、信用卡欺诈数据集检测信用卡交易…

全网最详细的LVS实战详解

一、Lvs-nat实战部署 1、准备 设置好网卡信息 2、基础环境搭建详情 ①调度器LVS:网卡ens160(NAT模式)、网卡ens224(仅主机模式)&#xff0c;使其可处于不同的VLAN段 为网卡ens160设置IP vmset.sh ens160 172.25.254.100 lvs.zf.org为网卡ens224设置IP vmset.sh ens224 192.…

在MAC安装Lazarus 起点 - 我们的第一个Lazarus程序!

安装Lazarus 首先到Lazarus官网&#xff0c;找到合适的版本下载页面&#xff0c;比如Mac的版本&#xff1a; https://sourceforge.net/projects/lazarus/files/Lazarus%20macOS%20x86-64/Lazarus%203.4/ 将三个文件都下载到本地&#xff0c;需要安装这三个文件&#xff1a; …

Python学习(1):使用Python的Dask库实现并行计算

目录 一、Dask介绍 二、使用说明 安装 三、测试 1、单个文件中实现功能 2、运行多个可执行文件 最近在写并行计算相关部分&#xff0c;用到了python的Dask库。 Dask官网&#xff1a;Dask | Scale the Python tools you love 一、Dask介绍 Dask是一个灵活的并行和分布式…

C语言 ——— 学习并使用字符分类函数

目录 学习isupper函数 学习isdigit函数 学习tolower函数 将输入的字符串中把大写字母转换为小写字母并输出 学习isupper函数 参数部分&#xff1a; 形参需要传递的是一个字母&#xff0c;字符在ASCII码表上是以整型存储的&#xff0c;所以实参部分用(int c)没有问题 返回…

HarmonyOS笔记3:从网络数据接口API获取数据

面向HarmonyOS的移动应用一般采用MVVM模式&#xff08;见参考文献【1】&#xff09;&#xff0c;其中&#xff1a; M&#xff08;Model层)&#xff1a;模型层&#xff0c;存储数据和相关逻辑的模型。它表示组件或其他相关业务逻辑之间传输的数据。Model是对原始数据的进一步处理…

享界S9别乱选,定价有大玄机!

文 | AUTO芯球 作者 | 雷慢 享界S9刚上市&#xff0c; 就有人傻钱多、工作忙的老大哥来问我&#xff0c; 两个版本怎么选&#xff1f; 这不巧了吗&#xff0c;论华为车系&#xff0c;我是资深用户&#xff0c; 常开问界M9&#xff0c;试过智界S7&#xff0c;问界M7&#x…

PUA自己到无法自拔,或许是你过度信奉【优绩主义】

本文算是人文社科心理篇的第二期&#xff0c;不时发一些【理性】的【鸡汤】&#xff0c;或许对你认识社会本质有所帮助~ 一.定义 顾名思义&#xff0c;从理科生的角度来说&#xff0c;【优绩主义】以优秀的成绩作为评判人生是否成功的极大型指标&#xff0c;在东亚的【休息羞…

性能优化之自定义指令实现图片懒加载

1&#xff09;图片懒加载 是常见的用于在页面滚动时动态加载图片&#xff0c;而不是在页面加载时一次性加载所有图片。性能优化必备提高页面加载速度的手段&#xff0c;特别是在包含大量图片的网站上。 图片懒加载的原理&#xff0c;其实就是&#xff0c;当图片出现在视口内时…

数据分析:宏基因组的荟萃分析之MMUPHin

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 介绍 批次效应是实验中由于样本处理和测序技术变异引起的非生物学差异&#xff0c;可能干扰研究结果。这种效应难以完全消除&#xff0c;但可通过方法如PCA、PC…

【Vue3】Pinia getters

【Vue3】Pinia getters 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本…