C++的STL简介(一)

目录

1.什么是STL

2.STL的版本

3.STL的六大组件

 4.string类

4.1为什么学习string类?

4.2string常见接口

4.2.1默认构造

​编辑

4.2.2析构函数

 Element access:

4.2.3 []

4.2.4迭代器

​编辑

 auto

 4.2.4.1 begin和end

 4.2.4.2.regin和rend

Capacity:

 4.2.5.3 size

4.2.6 lenth 

4.2.7 cleart

Modifiers:

4.2.7 apend

4.2.8  +=

4.2.9 erase

4.2.10 replace

 String operations:

 4.2.11 find

4.2.12 substr

4.2.13  find_first_of

4.2.14  find_ last_of

4.2.15 find_first_not_of

 4.2.16 find_last_not_of


1.什么是STL

STL(standarf template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2.STL的版本

  • 原始版本

Alexander Stepanov MengLee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用,拷贝,修改,传播,商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。HP版本--所有STL实现版本的始祖。

  • P.J.版本

由P.J.Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。

  • RW版本

由Rouge Wage 公司开发,继承自HP版本,被C++ Builder 采用 ,不能公开或修改,缺陷:可读性一般

  • SGL版本

由Silicon Graphics Computer Systems ,Inc公司开发,继承自HP版本。被GCC(Linux)采用,可移植性较好,可公开,修改甚至贩卖,从命名风格和编程风格上看,阅读性非常高。

3.STL的六大组件

 4.string类

4.1为什么学习string类?

C语言中,字符串是以"\0"结尾的一些字符的集合,为了方便操作,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。而且在常规工作中,为了简单,方便,快捷,基本都使用string类,很少有人使用C库中的字符串操作函数

4.2string常见接口


4.2.1默认构造

实例

	//无参构造//string();string s1;//带参构造string s2("111");//string(const char* s);	//拷贝构造string s3(s2);//string(const string & str);string s4("123", 2, 1);//string(const string & str, size_t pos, size_t len = npos);//复制str中从字符下标位置 pos 开始的len个 字符进行拷贝构造(如果任一 str 太短或 len 为 string::npos,则复制到str 的末尾)。string s5("123",0 ,string:: npos);//	string(const char* s, size_t n);string s6("123", 2);//从 s 指向的字符数组中复制前 n 个字符。//string(size_t n, char c);//用连续的n个c字符去初始化string s7(3, 'c');//template <class InputIterator>//string(InputIterator first, InputIterator last);
4.2.2析构函数

 Element access:

4.2.3 []

获取字符串的字符

 利用[]来进行读写,下标+[]遍历

int main()
{   string s1("abcd");//写s1[0] ='*';//将下标为0的元素修改为1cout << s1 << endl;//读for (int i = 0; i < s1.size(); i++){cout << s1[i] ;}return 0;
}

 

[]原型

class string
{public:
char&	operator[](size_t i){return _str[i];}
private:char* _str;size_t _size;size_t _capacity;
};
4.2.4迭代器

在 STL 中,迭代器(Iterator)用来访问和检查 STL 容器中元素的对象,它的行为模式和指针类似,但是它封装了一些有效性检查,并且提供了统一的访问格式。他的底层是指针

迭代器遍历

int main()
{   string s1("abcd");string::iterator it = s1.begin();while (it != s1.end()){cout << *it <<" " ;++it;}return 0;
}
 auto

补充一个C++小语法

auto可自动推导类型,极大程度简化代码

const string s3("hello ward!");//string::const_iterator cit=s3.begin(); 可简写成:
auto cit = s3.begin();

 auto声明方式

auto  变量名

auto  函数名 (形参列表)

{

//函数体

}

 auto的实例

int fun()
{return 10;
}
int main()
{int a=10;auto b = a;auto c = 'a';auto d = fun();auto& e = a;auto* f = &a;cout << typeid(a).name() << endl;cout << typeid(b).name()<< endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;cout << typeid(e).name() << endl;cout << typeid(f).name() << endl;return 0;
}

  • 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储的局部变量,后来这个不重要了,C++11中,标准委员会被废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得
  • 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时必须加&
  • 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
  • auto不能作为函数的参数,可以做返回值,但是谨慎使用
  • aoto不能直接用来声明数组

范围for遍历

 aoto自动推导,字符赋值,自动迭代,自动判断结束,底层上也是迭代器,所有的容器都支持范围for,因为所有的容器都支持迭代器

 4.2.4.1 begin和end

 1.begin

 返回第一个字符的正向迭代器

int main()
{   string s1("abcd");cout<<* s1.begin();return 0;
}

 

2. end 返回最后一个字符的正向迭代器

 可配合起来正向遍历

int main()
{string s1("abcdef");string::const_iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";it++;}return 0;
}

 

 4.2.4.2.regin和rend

regin 返回最后一个的反向迭代器

 rend 返回第一个字符的反向迭代器

配合起来可支持反向遍历

int main()
{string s1("abcdef");string::const_reverse_iterator it = s1.rbegin();while (it != s1.rend()){cout << *it << " ";it++;}return 0;
}

 

Capacity:

 4.2.5.3 size

 返回字符串的长度,不包括'\0'

int main()
{   string s1("abcd");cout << s1.size();return 0;
}

4.2.6 lenth 

  返回以字节为单位的长度,不包括"\0"

int main()
{string s1("abcdef");cout << s1.length()<<endl;return 0;
}

 

4.2.7capacity

l返回容量大小

 

 4.2.7reserve

保留预留,提前开空间,避免扩容,提高效率

int main()
{string s1("abcdef");cout << s1.capacity() << endl;s1.reserve(100);cout << s1.capacity()<<endl;//可以扩容,>=100s1.reserve(50);cout << s1.capacity() << endl;//一般不会缩容return 0;
}

4.2.7 cleart

清除数据,一般不清除容量

int main()
{string s1("abcdef");cout << s1.capacity() << endl;cout << s1.size() << endl;s1.clear();cout << s1.capacity() << endl;cout << s1.size() << endl;//一般不会缩容return 0;
}

 

Modifiers:

4.2.7 apend

字符串追加


int main()
{string s1("abcdef");//string& append(const string & str);s1.append("yyy");cout << s1 << endl;//	string& append(const string & str, size_t subpos, size_t sublen);
//追加 str 子字符串的副本。子字符串是 str 中从字符位置 subpos 开始并跨越 sublen 字符的部分(或者直到 str 的末尾,如果任一 str 太短或 sublen 是 string::npos)。s1.append("aaaa", 2, 1);cout << s1 << endl;return 0;
}

 

4.2.8  +=

字符串拼接,尾插

int main()
{string s1("abcdef");string s2("123");//string& operator+= (const string & str);s1 += s2;s1 += 'a';
//string& operator+= (char c);s1 += "aaa";
//string & operator+= (const char* s);return 0;
}
int main()
{string s1("abcdef");string s2("123");//string& insert(size_t pos, const string & str);// 在pos之前插入strs1.insert(0, "abc");//string& insert(size_t pos, const string & str, size_t subpos, size_t sublen);//在下标pos位置之前插入str下表中subpos到下标sublen位置的元素s2.insert(0, "abcdd", 0, 4);cout << s2 << endl;//string & insert(size_t pos, const char* s);//在pos位置之前插入s//string& insert(size_t pos, const char* s, size_t n);//从在下标为pos的位置插入s的n个字符//string& insert(size_t pos, size_t n, char c);//在pos位置之前插入n个c字符//void insert(iterator p, size_t n, char c);//在迭代器的位置之前插入n个字符c//iterator insert(iterator p, char c);//在迭代器的位置之前插入字符cs1.insert(s1.begin(), '*');cout << s1 << endl;return 0;
}
4.2.9 erase

头删

int main()
{string s1("abcdef");string s2("123");//string& erase(size_t pos = 0, size_t len = npos);//擦除字符串值中从字符位置 pos 开始并到 len 字符的部分不包括len(如果内容太短或 len 为 string::npos,则擦除字符串值的末尾。s1.erase(0, 2);//iterator erase(iterator p);//擦除 p 指向的字符。s1.erase(s1.begin());//iterator erase(iterator first, iterator last);
//擦除[first,last] 范围内的字符序列s1.erase(s1.begin(), s2.end());cout << s1 << endl;return 0;
}
4.2.10 replace

替换

int main()
{string s1("abcdef");string s2("123");//string & replace(size_t pos, size_t len, const char* s);//string& replace(size_t pos, size_t len, const string & str);//把pos位置到len位置替换成str//string& replace(iterator i1, iterator i2, const char* s);//string& replace(iterator i1, iterator i2, const string & str);//把i1到i2之间的迭代器换成str//string& replace(size_t pos, size_t len, size_t n, char c);//string& replace(size_t pos, size_t len, const char* s, size_t n);//把pos位置到len位置替换成str中的前n个//string& replace(iterator i1, iterator i2, const char* s, size_t n);//把i1到i2之间的迭代器换成str中的前n个//string& replace(iterator i1, iterator i2, size_t n, char c);//把i1到i2之间的迭代器换成n个字符c//string& replace(iterator i1, iterator i2,//InputIterator first, InputIterator last);//将迭代器输入到范围内的初始位置和最终位置。使用的范围是 [first,last),它包括 first 和 last 之间的所有字符,包括 first 指向的字符,但不包括 last 指向的字符return 0;
}

 String operations:

 4.2.11 find

查找

返回第一个匹配的第一个字符的位置。
如果未找到匹配项,该函数将返回 string::npos。(整型最大值)

int main()
{string s1("abcdef");string s2("123");//size_t find(const string & str, size_t pos = 0) const;s1.find("bce");//	size_t find(const char* s, size_t pos = 0) const;//在pos位置找ss1.find('a');//	size_t find(const char* s, size_t pos, size_t n) const;//从pos位置找s的前n个cout<< s1.find("aaa", 1, 2);//	size_t find(char c, size_t pos = 0) const;//从pos位置开始搜索字符creturn 0;
}
4.2.12 substr

获得对于位置以后的子串然后重新构成string类返回

int main()
{string s1("abcdef");//tring substr(size_t pos = 0, size_t len = npos) const;//从pos位置开始的len个字符重新构建成string再返回s1.substr(3, 4);return 0;
}

实例

int main()
{string s("text.cpp");size_t pos = s.rfind('.');string suffix = s.substr(pos);cout << suffix << endl;;return 0;
}

 

4.2.13  find_first_of

顺着找字符串中的字符,找到返回第一个出现的下标


int main()
{string s1("abcdef");//ze_t find_first_of(const string & str, size_t pos = 0) const;//ize_t find_first_of(const char* s, size_t pos = 0) const;//ize_t find_first_of(char c, size_t pos = 0) const;//在pos位置开始找str中的字符s1.find_first_of("abc");//ize_t find_first_of(const char* s, size_t pos, size_t n) const;//在pos位置找s的前n个return 0;
}
4.2.14  find_ last_of

倒着找字符串中的字符,找到返回第一个出现的下标

int main()
{string s1("abcdef");//size_t find_last_of(const string & str, size_t pos = npos) const;// //size_t find_last_of(char c, size_t pos = npos) const;// size_t find_last_of(const char* s, size_t pos = npos) const;//从最后一个位置向前找str中的字符s1.find_last_of("Abc",2,4);//size_t find_last_of(const char* s, size_t pos, size_t n) const;//从最后一个位置向前找str中的n个字符return 0;
}

 分割文件

void SplitFilename(const std::string & str){std::cout << "Splitting:" << str << endl;std::size_t found = str.find_last_of(" / \\");std::cout << "path:" << str.substr(0, found) << endl;std::cout << "file:" << str.substr(found + 1) << endl;}
int main()
{string str1("windows\\winhelp.exe");string str2("/url/bin/man");SplitFilename(str1);cout << endl;SplitFilename(str2);return 0;
}

4.2.15 find_first_not_of

没找到就返回,顺着找返回第一个不匹配的对应下标

int main()
{string s1("abcdef");//size_t find_first_not_of(const string & str, size_t pos = 0) const;//size_t find_first_not_of(const char* s, size_t pos = 0) const;	// //size_t find_first_not_of(char c, size_t pos = 0) const;//从第一个位置向前找str中的n个字符找到第一个不匹配的元素下标,找不到就返回// //size_t find_first_not_of(const char* s, size_t pos, size_t n) const;//从第一个位置向后找中第一个不匹配的字符str中的前n个的字符return 0;
}

实例

int main()
{//string str("Please, replace the vowels in this sentence by asterisks.");//除了"abcdef"以外全部替换成*std::size_t found = str.find_first_not_of("abcdef");while (found != std::string::npos){str[found] = '*' ;found = str.find_first_not_of("abcdef", found + 1);}std::cout << str;return 0;
}

 

 4.2.16 find_last_not_of

倒着找,找到第一个不匹配返回下标

int main()
{//ize_t find_first_not_of(const string & str, size_t pos = 0) const;//	size_t find_first_not_of(const char* s, size_t pos = 0) const;//size_t find_first_not_of(char c, size_t pos = 0) const;// 从最后一个位置向前找第一个不匹配str中的字符的下标//size_t find_first_not_of(const char* s, size_t pos, size_t n) const;//从最后一个位置向前找第一个不匹配str中的前n个字符的下标,找不到就返回return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Q238. 除自身以外数组的乘积

思路 一开始想到的是按位乘 看了题解&#xff0c;思路是存i左边的乘积和 与 i右边的乘积和 代码一&#xff1a; 需要三次循环,需要额外空间 left和right数组 代码&#xff1a; public int[] productExceptSelf(int[] nums) {int[] left new int[nums.length];int[] right …

【爱上C++】list用法详解、模拟实现

文章目录 一&#xff1a;list介绍以及使用1.list介绍2.基本用法①list构造方式②list迭代器的使用③容量④元素访问⑤插入和删除⑥其他操作image.png 3.list与vector对比 二&#xff1a;list模拟实现1.基本框架2.节点结构体模板3.__list_iterator 结构体模板①模板参数说明②构…

基于Xejen框架实现的C# winform鼠标点击器、电脑按键自动点击器的软件开发及介绍

功能演示 文章开始之前&#xff0c;仍然是先来个视频&#xff0c;以便用户知道鼠标连点器的基本功能 软件主界面 多功能鼠标连点器 快速点击&#xff1a; 痕即鼠标点击器可以设定每秒点击次数&#xff0c;让您轻松应对高频点击需求。 切换时长&#xff0c;即每次动作之间的间…

大数据的数据质量有效提升的研究

大数据的数据质量有效提升是一个涉及多个环节和维度的复杂过程。以下是从数据采集、处理、管理到应用等方面&#xff0c;对大数据数据质量有效提升的研究概述&#xff1a; 一、数据采集阶段 明确采集需求&#xff1a;在数据采集前&#xff0c;需明确数据需求&#xff0c;包括…

leetocde662. 二叉树最大宽度,面试必刷题,思路清晰,分点解析,附代码详解带你完全弄懂

leetocde662. 二叉树最大宽度 做此题之前可以先做一下二叉树的层序遍历。具体题目如下&#xff1a; leetcode102二叉树的层序遍历 我也写过题解&#xff0c;可以先看看学习一下&#xff0c;如果会做层序遍历了&#xff0c;那么这题相对来说会简单很多。 具体题目 给你一棵…

把 网页代码 嵌入到 单片机程序中 2 日志2024/7/26

之前不是说把 网页代码 嵌入到 单片机程序中 嘛! 目录 之前不是说把 网页代码 嵌入到 单片机程序中 嘛! 修改vs的tasks.json配置 然后 测试 结果是正常的,可以编译了 但是:当我把我都html代码都写上去之后 还是会报错!!! 内部被检测到了,没辙,只有手动更新了小工具代码 …

Python3网络爬虫开发实战(2)爬虫基础库

文章目录 一、urllib1. urlparse 实现 URL 的识别和分段2. urlunparse 用于构造 URL3. urljoin 用于两个链接的拼接4. urlencode 将 params 字典序列化为 params 字符串5. parse_qs 和 parse_qsl 用于将 params 字符串反序列化为 params 字典或列表6. quote 和 unquote 对 URL的…

JAVAWeb实战(前端篇)

项目实战一 0.项目结构 1.创建vue3项目&#xff0c;并导入所需的依赖 npm install vue-router npm install axios npm install pinia npm install vue 2.定义路由&#xff0c;axios&#xff0c;pinia相关的对象 文件&#xff08;.js&#xff09; 2.1路由(.js) import {cre…

HarmonyOS Next 省市区级联(三级联动)筛选框

效果图 完整代码 实例对象 export class ProvinceBean {id?: stringpid?: stringisSelect?: booleandeep?: objectextName?: stringchildren?: ProvinceBean[] }级联代码 import { MMKV } from tencent/mmkv/src/main/ets/utils/MMKV import { ProvinceBean } from ..…

nodeselector

1.概述 在创建pod资源是&#xff0c;k8s集群系统会给我们将pod资源随机分配到不同服务器上。我们通过配置nodeSelector可以将pod资源指定到拥有某个标签的服务器上 使用nodeselector前我们要先给每个节点打上标签&#xff0c;在编辑pod资源的时候选择该标签 2.示例 给节点打标…

数据科学统计面试问题 -40问

前 40 名数据科学统计面试问题 一、介绍 正如 Josh Wills 曾经说过的那样&#xff0c;“数据科学家是一个比任何程序员都更擅长统计、比任何统计学家都更擅长编程的人”。统计学是数据科学中处理数据及其分析的基本工具。它提供了工具和方法&#xff0c;可帮助数据科学家获得…

初涉JVM

JVM 字节码、类的生命周期、内存区域、垃圾回收 JVM主要功能&#xff1a; 解释运行&#xff08;翻译字节码&#xff09;内存管理&#xff08;GC&#xff09;即使编译&#xff08;Just - In - Time&#xff0c; JIT&#xff09; 将短时间内常使用到的字节码翻译成机器码存储在内…

【Gin】智慧架构的巧妙砌筑:Gin框架中控制反转与依赖注入模式的精华解析与应用实战(下)

【Gin】智慧架构的巧妙砌筑&#xff1a;Gin框架中控制反转与依赖注入模式的精华解析与应用实战(下) 大家好 我是寸铁&#x1f44a; 【Gin】智慧架构的巧妙砌筑&#xff1a;Gin框架中控制反转与依赖注入模式的精华解析与应用实战(下)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; …

uboot的mmc partconf命令

文章目录 命令格式参数解释具体命令解释总结 mmc partconf 是一个用于配置 MMC (MultiMediaCard) 分区的 U-Boot 命令。具体来说&#xff0c;这个命令允许你设置或读取 MMC 卡的分区配置参数。让我们详细解释一下 mmc partconf 0 0 1 0 命令的含义。 命令格式 mmc partconf &…

【网络安全】子域名模糊测试实现RCE

未经许可&#xff0c;不得转载。 文章目录 正文总结 正文 在之前测试一个私人项目时&#xff0c;我报告了admin.Target.com上的Auth Bypass漏洞&#xff0c;这将导致SQLI&RCE &#xff0c;该漏洞在报告后仅一天就被修复。 现在重拾该应用程序&#xff0c;对子域进行模糊测…

探索 Blockly:自定义积木实例

3.实例 3.1.基础块 无输入 , 无输出 3.1.1.json var textOneJson {"type": "sql_test_text_one","message0": " one ","colour": 30,"tooltip": 无输入 , 无输出 };javascriptGenerator.forBlock[sql_test_te…

c语言第四天笔记

关于 混合操作&#xff0c;不同计算结果推理 第一种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 13 第二种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 7 7 前面的7是因为后面i的变化被影响后&#xff0c;重新赋值 14 第一种编译结果&#xff…

后端解决跨域(Cross-Origin Resource Sharing)(三种方式)

注解CrossOrigin 控制层的类上或者方法上加注解CrossOrigin 实现接口并重写方法 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {// 设置允许跨域的路径registry.addMapping("/**&qu…

springboot配置文件如何读取pom.xml的值

比如想读取profile.active的值&#xff0c;默认属性为pro 在maven中加入以下插件&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.2.0</version>&l…

Servlet详解(超详细)

Servlet详解 文章目录 Servlet详解一、基本概念二、Servlet的使用1、创建Servlet类2、配置Servleta. 使用web.xml配置b. 使用注解配置 3、部署Web应用4、处理HTTP请求和生成响应5、处理表单数据HTML表单Servlet 6、管理会话 三、servlet生命周期1、加载和实例化2、初始化3、 请…