STL简介

2023-05-16

STL主要包含了容器、迭代器、算法和string四部分。

标准库算法对迭代器而不是容器进行操作。因此,算法不能(直接)添加或删除元素。

一、容器

容器为存储和管理数据对象的集合,包含了三种容器:

1.线性容器:该类容器的逻辑结构为线性结构。可以通过下标访问元素的容器称为随机容器,其特点是容器中的元素在内存中是连续存放的,容器的存储结构为顺序存储结构。vector和deque为随机容器。

2.适配器容器:以线性容器作为底层容器,且对线性容器的通用接口加以限制。默认的底层容器为双端队列。只要满足上层容器对接口的要求,也可以用自己定义的容器类型作为适配器容器的底层容器。

3.关联容器:其存储结构为平衡树,基于红黑树实现。

容器的创建 :

//模板类创建
vector<int>a; //定义了一个vector类型的变量,其中元素为整型

//用户自定义类型的容器变量
struct node{
    int key;
    int data;
};  
vector<node>b;

注意:用户自定义的类型不适用于容器priority_queue、map、multimap、set、multiset
的类型参数,因为这类容器需要根据元素值的大小来决定存放位置。因此,创建这类容器时,
需定义元素之间的比较准则,确保元素之间可以进行比较。
因此,若用户自定义类型为整形、字符型等基本数据类型,也适用于以上容器;
若容器元素类型为用户自定义类型,则必须指定自定义类型变量之间的比较方法。

//第一种方法:基于运算符的比较方法
//包含小于运算符重载的类型定义
struct node{
    int key;
    int data;
    bool operator<(const node &n1)const{
        return key<n1.key;
    }
};
set<node>se;

//第二种方法:基于比较器的比较方法
//即定义对函数调用进行重载的结构,并在创建对象时将该结构名作为参数
struct cmp{
    bool oprator()(node n1,node n2){
        return n1.key<n2.key;
    }
};
set<node,cmp>se;

容器的基本操作: 

size()
empty()
insert()
erase()
clear()
begin()
end()

pair类型:

pair类型的变量将一对值组合成一个整体(相当于一个含有两个元素的结构),这一对值可以具有不同的数据类型,可以用pair的;两个公有属性first和second访问这两个值。

pair<int,string>p(1,"hahaha");         //在定义时初始化
p=make_pair(2,"abc");                  //改变pair变量的值
cout<<p.first<<" "<<p.seconnd<<endl;   //输出pair中的两个元素
vector<pair<int,int>>vp;               //pair作为其他容器的类型参数
vp.push_back(make_pair(2,4));
cout<<vp[0].first<<" "<<vp[0].second<<endl; 

二、迭代器 

迭代器可以访问容器(适配器容器除外)的元素,迭代器和容器的关系类似于指针和数组的关系。迭代器和指针之间的一个重要区别就是不存在NULL的迭代器。

//迭代器的定义方式:
//容器类型::iterator it
vector<int>::iterator it;

//向前/后移动
it--; 
it++;

//随机迭代器如vector和deque,可以采用加上或减去一个整数的方式向后/向前移动
it = it+2;

//非随机容器的迭代器只能采用“++”或“--”移动

//举例:遍历容器所有元素
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
        cout<<*it<<end;

三、算法 

string用法

//头文件
#include<string>

//初始化
string s1;
string s2("hello world!");
string s3="hello china!";

//赋值与比较
if(s2>s3) cout<<s2<<endl; //两个字符串比较,另外可以使用比较运算符
else cout<<s3<<endl;

//连接、插入与删除
//可以利用加号运算符或append函数将两个字符串连接在一起
//插入字符串可以使用insert函数;
//删除字符或子串可以使用erase函数。
s1 = s2+s3+"OK!";
s1+=s2;
s1.append(s2);
s1.insert(5,"abc"); //在s1的第五个位置出添加字符串
s1.erase(5,7) //删除s1中5-7位置的字符

//补充与拓展
//可以通过substr函数求一个字符串的子串
//可以通过find函数查找是否存在某个字符或字符串
cout<<s1.substr(3)<<endl; //得到s1从位置3开始后面的所有字符促成的子串
cout<<s1.substr(3,5)<<endl; //得到s1从位置3开始的5个字符所组成的子串
cout<<(signed)s1.find("l")<<endl; //查找s1中是否含有l字符,存在返回第一个“l”的下标,否则返回-1
cout<<(signed)s1.find("hi")<<endl;
cout<<(signed)s1.find("hi",3)<<endl;  //从s1[3]后开始查找是否存在字符串“hi”
cout<<(signed)s1.find("l")<<endl;  //在s1的下标区间[3,10)范围内查找是否存在字符串“hi”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL简介 的相关文章

随机推荐

  • FreeRTOS中断管理 基于STM32

    文章目录 一 异常与中断的基本概念 二 中断的介绍 三 和中断相关的名词解释 四 中断管理的运作机制 五 中断延迟的概念 六 中断管理的应用场景 七 中断管理讲解 八 中断管理实验 九 中断管理实验现象 一 异常与中断的基本概念 异常是导致
  • 链表基础知识详解(非常详细简单易懂)

    概述 xff1a 链表作为 C 语言中一种基础的数据结构 xff0c 在平时写程序的时候用的并不多 xff0c 但在操作系统里面使用的非常多 不管是RTOS还是Linux等使用非常广泛 xff0c 所以必须要搞懂链表 xff0c 链表分为单
  • FreeRTOS临界段的保护

    什么是临界段 临界段用一句话概括就是一段在执行的时候不能被中断的代码段 在 FreeRTOS 里面 xff0c 这个临界段最常出现的就是对全局变量的操作 xff0c 全局变量就好像是一个枪把子 xff0c 谁都可以 对他开枪 xff0c 但
  • SPI通讯协议详解 基于STM32

    SPI 协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议 Serial Peripheral Interface xff0c 即串行外围设备接口 xff0c 是 一种高速全双工的通信总线 它被广泛地使用在 ADC LCD 等设备与 MC
  • C语言编译过程

    C语言的编译过程 xff1a 预处理 编译 汇编 链接 gcc E hello c o hello i 1 预处理 gcc S hello i o hello s 2 编译 gcc c hello s o hello o 3 汇编 gcc
  • C语言数组详解

    目录 一 数组的概念 二 数组的分类 2 1 按元素的类型分类 2 2 按维数分类 三 数组的定义 3 1 一维数组的定义 格式 xff1a 3 2 二维数组的定义 四 定义并初始化 4 1 一维数组的初始化 4 2 二维数组的初始化 五
  • C语言动态分配内存

    文章目录 一 动态分配内存的概述 二 静态分配 动态分配 三 动态分配函数 3 1 malloc 3 2 free 3 3 calloc 3 4 realloc 四 内存泄漏 一 动态分配内存的概述 在数组一章中 xff0c 介绍过数组的长
  • 嵌入式C语言(入门必看)

    目录 STM32的数据类型 const关键字 static 关键字 volatile关键字 extern关键字 struct结构体 enum typedef define 回调函数 ifdef ifndef else if 嵌入式开发中既有
  • ESP32上手指南

    乐鑫的ESP32微控制器是一款集成有2 4 GHz Wi Fi和蓝牙4 0双模的物联网芯片方案 xff0c 采用台积电 TSMC 超低功耗的40纳米工艺代工 片上集成有天线开关 射频巴伦 功率放大器 接收低噪声放大器 滤波器 电源管理模块等
  • 基于STM32硬币识别检测

    本设计基于ARM内核的单片机STM32F4的高识别率硬币识别装置 xff0c 主要应用于各公共营业场所 xff0c 如各超市 xff0c 自动售货机 xff0c 公共交通等 它应该能完成一角 xff08 分新版旧版 xff09 xff0c
  • PHP多维数组排序

    User 61 M 39 User 39 Incomelog 61 M 39 incomelog 39 user 61 User gt select now date 61 39 2015 02 09 39 integral 61 arra
  • PH电极酸碱度检测

    最近做了一个项目是关于PH电极测酸碱度的一个仪器 简单地说 xff1a 玻璃电极是一种氢离子选择性电极 xff0c 相当于一个对玻璃膜两侧氢离子浓度差异能产生附加电势差的 盐桥 xff0c 一般的盐桥是为了消除浓差电势或者液体接触电势这种附
  • 关于调试RTC时钟出现的问题

    此次做一个项目出现了一个令我很不解的问题 xff0c 就是RTC时钟 xff0c 代码是提前写好的 xff0c 当时是用的STM32F103ZET6最小系统板 xff0c 所有功能都是没有问题的 但是最终我画好的PCB芯片用的是STM32F
  • vscode编写c/c++及自动配置c/c++环境

    目录 前言所需的工具链接一 vscode中文设置及c c 43 43 插件安装1 中文设置2 c c 43 43 插件安装 二 环境配置1 解压AutoVsCEnv WPF V1 993自动配置工具压缩包2 运行AutoVsCEnv WPF
  • 安装最新版keil5编译报错*** target ‘target 1‘ uses arm-compiler ‘default compiler version 5‘ which i,keil5.37版

    原因是 missing compiler version5 xff0c 缺少V5编译器 xff08 compiler version5 xff09 xff0c 因为打开的工程比较老 xff0c 是用v5的编译器写的 xff0c 而现在下的k
  • vector的理解以及模拟实现

    vector的理解以及模拟实现 vector介绍vector常见函数介绍vector模拟实现及迭代器失效讲解 vector介绍 vector文档 vector是表示可变大小数组的序列容器 就像数组一样 xff0c vector也采用的连续存
  • 《数据库的嵌套查询和统计查询》

    选择Study数据库 xff0c 用SQL语句进行以下查询操作 1 xff0e 嵌套查询 求选修了数据结构的学生学号和成绩 span class token keyword SELECT span Sno span class token
  • 由NP完全问题引出动态规划——状态压缩DP

    所有部分都应当在非强制的情况下组合回一起 要记住 xff0c 你重组的那部分原来就是你拆解的 因此 xff0c 如果你不能让它们组合回来的话 xff0c 那一定是有原因的 要想尽一切办法 xff0c 除了用锤头 IBM手册 1925 Par
  • IMU学习的一些记录(不含推导公式,仅做了解)

    IMU xff08 惯性测量元件 xff09 测量三个量 xff1a 1 加速度 2 角速度3地磁 xff08 具体内容不展开 xff09 原始数据采集 IMU芯片与单片机硬件享连 xff0c 通过程序处理数据 上位机 xff08 一般运行
  • STL简介

    STL主要包含了容器 迭代器 算法和string四部分 标准库算法对迭代器而不是容器进行操作 因此 xff0c 算法不能 xff08 直接 xff09 添加或删除元素 一 容器 容器为存储和管理数据对象的集合 xff0c 包含了三种容器 x