learn C++ NO.9——STL简介、string(1)

news2024/12/23 8:13:15

文章目录

  • STL简介
    • 什么是STL?
    • 发展历史以及版本
    • STL六大组件
  • 初识string类
    • 在线文档的简介
    • string类的简介
    • 默认成员函数
      • string类的构造函数
      • string的析构函数和赋值等号重载
    • 流插入操作符重载和流提取操作符重载
    • push_back接口和append接口
    • 加操作符重载和加等操作符重载

STL简介

什么是STL?

STL指的是C++标准模板库(Standard Template Library),是一个C++中的通用库,包括许多常用的数据结构和算法,如vector、list、set、map、sort、find等。STL库的主要目标是提供一组高效、可靠、通用的模板类和函数,方便开发者使用,提高开发效率和代码质量。STL是C++标准库的重要组成部分,也是C++编程中不可或缺的一部分。

发展历史以及版本

STL(Standard Template Library)是由Alexander Stepanov和Meng Lee于1994年首次提出的。Alexander Stepanov是惠普公司(HP)的研究员,他在1983年到1994年期间在惠普公司工作,期间他开始了STL的研究和开发工作。Meng Lee是斯坦福大学的一位教授,他是Alexander Stepanov的学生,参与了STL的开发工作。

1994年,STL第一次公开发表,被纳入到C++标准库中。1998年,C++标准库正式发布,STL被正式纳入其中。2000年,STLport项目开始,旨在将STL移植到不同的编译器和操作系统中,并保持其兼容性。

随着C++标准的不断发展,STL的发展也在不断地推进。在C++11中,STL引入了新的特性和数据结构,如unordered_set、unordered_map、array等。在C++17中,STL也引入了更多的更新和改进,如parallel algorithms等。

总之,STL的发展历程是与C++标准库的发展密不可分的。随着C++的不断发展,STL也在不断地完善和发展。

STL分为许多版本,这里主要介绍常见的版本:原始版(HP版本),它是所有STL的鼻祖,对程序开发做出了不可磨灭的贡献。P.J版本,大家用的VS上采用的就是这个版本。SGI版本由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好, 可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。

STL六大组件

STL六大组件分别是容器、算法、迭代器、仿函数、空间配置器和配接器。在后面的学习中会一一具体介绍。这里简单了解即可。

在这里插入图片描述

初识string类

在线文档的简介

在正式介绍string类之前,推荐两个在线的c++文档查询网站,对于我们c++的学习非常有帮助。 官网和非官方。这里推荐使用非官方的在线文档,因为比较简洁方便查找。当然官方的文档非常详细,两者各有优势,可以按照喜好自行选择。
在这里插入图片描述

string类的简介

string是C++标准库中的一个类,用于处理字符串。string类的本质就是管理字符串的顺序表。
在这里插入图片描述
下面就正式开始介绍string类。

默认成员函数

在这里插入图片描述

string类的构造函数

在这里插入图片描述
string类一共提供了7种构造函数,分别是(1)无参构造。(2)拷贝构造。(3)拷贝子串构造,即从源string类的pos位置拷贝len个字符进行构造、(4)用c字符串构造,c字符串指的是c语言下以’\0’作为结束标识符的字符数组。(5)取c字符串中的n个字符进行构造。(6) 以n个字符来进行构造。(7)迭代器范围进行初始化,这里不重点讲,后面会介绍迭代器。
下面简单介绍一下(3)

//substring (3)	
string (const string& str, size_t pos, size_t len = npos);

这里的缺省参数npos其实是一个静态成员变量,表示的是4294967295。即0xffffffff。
在这里插入图片描述
其实就是将源string类的pos下标处的字符开始,拷贝len个字符进行构造

#include<iostream>
#include<string>

using namespace std;

int main()
{
	string str1("hello world");
	string str2(str1, 6, 5);
	string str3(str1,6);
	
	cout << str2 << endl;
	cout << str3 << endl;

	return 0;
}

在这里插入图片描述

string的析构函数和赋值等号重载

析构函数和赋值等号重载就简单看看就行。析构函数就是清理string类实例化对象的资源。赋值等号重载,就是给string类实例化的对象赋值,使当前值被替换。
在这里插入图片描述

#include<iostream>
#include<string>

using namespace std;

int main()
{
	string str1;
	str1 = "abcde";
	cout << str1 << endl;

	str1 = 'c';
	cout << str1 << endl;

	return 0;
}

在这里插入图片描述

流插入操作符重载和流提取操作符重载

在这里插入图片描述

int main()
{
	string str1;
	cin >> str1;
	cout << str1 << endl;

	return 0;
}

在这里插入图片描述

push_back接口和append接口

这里个接口都是用来给string类实例化出的对象进行尾插字符或字符串的。push_back是在string类对象后尾插一个字符。append是在当前string类对象后追加字符、字符串、string类对象等等。
在这里插入图片描述
在这里插入图片描述
这里的接口其实和上面介绍的构造函数的重载的参数方面就可以大概猜测到append对应的不同参数的功能,这里我就不重复介绍,浅浅谈一下第(2)个接口,它是追加一个string类对象中的一部分,也就是子串。但是他的第三个参数并没有给默认参数,这一点其实就跟上面的构造有些许设计上的不同,这也是string类比较为人诟病的一点,就是参数的设计没有很好的延续性。

int main()
{
	string s1("hello");
	cout << s1 << endl;

	s1.push_back(' ');
	s1.append("world");

	cout << s1 << endl;
	return 0;
}

加操作符重载和加等操作符重载

加操作符重载和加等操作符重载都是在string类对象的尾部插入字符或字符串。+操作符比较少用主要还是用的+=操作符。加等运算符重载是一个公共成员函数,加运算符重载为了支持给字符、字符串追加string类对象的操作,所以是非成员函数。
在这里插入图片描述

在这里插入图片描述

#include<iostream>
#include<string>

using namespace std;

int main()
{
	string s1("hello world");	
	cout << s1 << endl;

	string s2 = s1 + "你好";
	cout << s2 << endl;

	s2 = s2 + 'C';
	cout << s2 << endl;

	s2 = s2 + s2;
	cout << s2 << endl;


	return 0;
}

在这里插入图片描述
其实+=运算符重载的底层实现其实就是复用上面的两个接口,当调用+=后面跟的是string类对象或字符串时,编译器就会调用append。当调用+=后面跟的是字符时,编译器就会调用push_back。从使用的角度出发,用+=运算符还是比较舒服的。

int main()
{
	string s1("hello world");
	cout << s1 << endl;

	s1 += "你好";
	cout << s1 << endl;

	s1 += 'C';
	cout << s1 << endl;

	string s2("xxxxxxxxx");
	s1 += s2;
	cout << s1 << endl;

	return 0;
}

为什么string类不像我们之前学习的c字符串,需要我们自己确定大小,以避免溢出。是因为string的底层实现类似于顺序表的机制,空间不够了可以自动扩容。

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

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

相关文章

阿里巴巴内部“Java工程师面试八股文汇总”不讲一句废话,肝就完事了

一转眼 2023 年已经过了大半了&#xff0c;不知道你金三银四上岸了&#xff0c;还是等着秋招呢&#xff1f;大家从 Boss 直聘上或者其他招聘网站上都可以看到 Java 岗位众多&#xff0c;Java 岗位的招聘薪酬天差地别&#xff0c;人才要求也是五花八门。而很多 Java 工程师求职过…

从0搭建Hyperledger Fabric2.5环境

Hyperledger Fabric 2.5环境搭建 一.Linux环境准备 # root登录 yum -y install git curl docker docker-compose tree yum -y install autoconf autotools-dev automake m4 perl yum -y install libtool autoreconf -ivf # 安装jq相关包 cd /opt git clone --recursive https…

C++作业day6

2.全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类&#xff0c;私有属性…

互联网医院源码分享,打造智慧医疗新模式

作为医疗行业的技术革新代表&#xff0c;互联网医院在现代医疗行业中扮演着越来越重要的角色。而互联网医院源码也是众多医院引进互联网医院的核心要素之一。在这篇文章中&#xff0c;我们将分享互联网医院源码的相关知识。 什么是互联网医院源码&#xff1f; 互联网医院源码…

Android——Activity初步(二)

说明&#xff1a; Android这个系列中使用的开发工具为&#xff1a;Eclipse中配置ADT插件。 <LinearLayout – 表示使用的是线性布局管理器xmlns:androidhttp://schemas.android.com/apk/res/android—引用Androidxmlns:tools"http://schemas.android.com/tools"a…

U盘打不开?恢复u盘,3招解决!

案例&#xff1a;u盘插入电脑后一点反应都没有&#xff0c;这是为什么呢&#xff1f;u盘打不开怎么办&#xff1f; 【我将u盘插入电脑后u盘显示无法打开&#xff0c;为什么会出现这种情况呢&#xff1f;遇到u盘打不开的情况应该怎么办呢&#xff1f;】 经常使用u盘存储文件的朋…

想升职加薪?网络安全行业推荐考取的证书

推荐大家考取CISP证书&#xff0c;CISP认证是业内公认的国内信息安全领域最权威的国家级认证。 对于在校大学生&#xff0c;可以考取NISP一级和二级&#xff0c;然后免费置换CISP&#xff1b; 对于安全领域相关从业者&#xff0c;直接考取CISP证书&#xff0c;CISP认证还有许…

大麦生成链接 大麦一键生成订单截图

一键生成购票链接 一键生成订单截图 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

springboot的目录结构作用

springboot单体项目结构大概如下。 代码都在src/main下&#xff0c; java是后端代码 java下最基本的包 dao(mapper) entity(model) service controller 其他的包根据项目需求扩展。 resources下是配置文件。 如果不是前后端分离&#xff0c;resources下放的是静态文件…

06【HTML5新增标签】

文章目录 六、HTML5新增标签6.1 布局标签6.1.1 常规布局标签6.1.2 控件标签1&#xff09;meter标签2&#xff09;progress标签3&#xff09;details标签4&#xff09;dialog标签 6.1.3 文本标签1&#xff09;ruby标签2&#xff09;mark标签 6.2 表单标签6.2.1 H5新增input类型6…

Hive序列化和反序列化

序列化和反序列化 文件读取/解析的方式 create table t1( id int, name string ) row format delimited fields terminated by , ;0,7369,SMITH,CLERK,7902,1980-12-17,800,null,20从文件里进行查询时&#xff0c;会不会在内存里产生hive的相关对象啊select * from student;…

Goland 包导入正常,但是无法解析函数和成员属性,编译不报错

这段时间 Goland 突然出现了一个毛病&#xff0c;每次 go get 依赖后&#xff0c;虽然依赖拉下来了&#xff0c;但是代码里使用了这个 module 的地方无法引用出他的成员和属性&#xff0c;大片的标红&#xff0c;都提示「Unresolved reference xxxxx」&#xff0c;但是只要把项…

6月29日Mendix北京见面会,抓紧时间报名!

喜欢Mendix的小伙伴们&#xff0c;好消息来啦&#x1f4e2;&#xff01; 6月29日&#xff0c;Mendix北京社区活动将在这个炎热的夏日中隆重推出&#xff0c;一起来参加吧&#xff01; 听说这次meet-up的嘉宾们都在用心准备内容中&#xff0c;这次不仅有MX首席架构师Matt、懂中…

Spring配置动态数据库

前言 本文主要介绍使用spring boot 配置多个数据库&#xff0c;即动态数据库 开始搭建 首先创建一个SpringWeb项目——dynamicdb(spring-boot2.5.7) 然后引入相关依赖lombok、swagger2、mybatis-plus&#xff0c;如下&#xff1a; <?xml version"1.0" encoding&q…

【编码魔法师系列_六大原则1】单一职责原则(Single Responsibility Principle)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

ABAP: NUMBER_GET_NEXT用法

NUMBER_GET_NEXT 是用来自动获取编号的方法。 1、SNRO : 创建编号范围对象&#xff0c;例如&#xff0c;ZTEST_001 点击间隔编辑&#xff0c;可以设置编号范围&#xff0c;如下图所示。 2、SE11: 自定义设置编号长度域&#xff0c;例如&#xff0c;ZTEST_NUM 3、程序里面调用N…

自动驾驶——基于五次多项式螺旋线方程的换道曲线规划

1.BackGround 已知&#xff1a;换道初始纵坐标y0&#xff08;横向距离&#xff09;&#xff0c;换道初始航向角tan0&#xff0c;换道时间t&#xff0c;换道结束纵坐标yf&#xff0c;换道结束航向角tanf&#xff0c;车速VehSpd&#xff0c;曲线中点曲率q且曲率变化率为0。求解期…

python:tkinter图形界面通讯录+txt文本存储数据

1 实验目的与要求 实验目的&#xff1a;设计一个实用的小型通讯录程序 实验要求&#xff1a;最后的通讯录要写入文件中保存起来 2 实验内容 本次实验内容如下&#xff1a; 设计一个实用的小型通讯录程序&#xff0c;具有添加&#xff0c;查询和删除功能。由姓名&#xff0…

jmeter008:结婚fiddler查看结果

如果通过jmeter的(察看结果树)查看响应数据不完整时&#xff0c; 可以结合fiddler来查看请求数据&#xff0c; 方法如下&#xff1a; 在请求的(高级)填写本地ip&#xff0c; 端口号&#xff0c;打开fiddler&#xff0c;运行jmeter请求即可抓包

【新版】系统架构设计师 - 计算机网络

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 架构 - 计算机网络 考点摘要 TCP/IP协议族&#xff08;★★★★&#xff09; 网路规划与设计&#xff08;★★★★&#xff09; 组网技术&#xff08;★&#xff09; 网络存储&#xff08;★&#xff09; IPv…