C++STL专题-string类

news2024/10/1 12:27:18

目录

1.标准库中的string类

1.1 string类

2.2 auto和范围for

2.2.1 auto关键字

2.2.2 范围for

2.3 string类的常用接口讲解

1.string类对象的常见构造

2.元素访问

3.迭代器(iterator)

3.1 begin 和 end

3.2 rbegin 和 rend

4.容器

5.修改

5.1 append

5.2 assign

5.3 insert

5.4 erase

5.5 replace

5.字符串操作

5.1 find

6.getline函数

6.1 第一种声明方式是传递三个参数。

6.2 第二种声明方式是传递两个参数


1.标准库中的string类

1.1 string类

头文件:#include<string>

string是管理字符串的类,在使用string类时,必须包含#include头文件以及using namespace std;

string类

其实string是typedef出来的,原型为basic_string<char>

 

2.2 auto和范围for

2.2.1 auto关键字

主要作用:替换长类型

auto错误使用总结:
(1).auto做类型不初始化

int main()
{
	auto e;//错误
	return 0;
}

(2).auto不能定义数组

int main()
{
	auto a[10] = { 1,2,3,4 };//错误
	return 0;
}

(3).auto不能做函数的参数(但是可以做返回值)

int add(auto a, auto b)//错误
{
	return a + b;
}
int main()
{
	int a = 1, b = 2;
	cout << add(a, b);
	return 0;
}

2.2.2 范围for

(1).C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围
内用于迭代的变量
第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

(2).范围for可以作用到数组和容器对象上进行遍历。

(3).范围for的底层很简单,容器遍历实际就是替换为迭代器。

遍历数组:

int main()
{
	int a[10] = { 1,2,3,4,5 };
	for (auto num : a)
	{
		cout << num << ' ';
	}
	return 0;
}

2.3 string类的常用接口讲解

1.string类对象的常见构造

重点
(constructor)函数名称功能说明
string()   (重点)构造空的string类对象,即空字符串
string(const char* s)   (重点)用C-string来构造string类对象
string(const string&s)   (重点)拷贝构造函数

int main()
{
	string s1;
	string s2("666");
	string s3(s2);

	cout << "string() " << s1 << endl;
	cout << "string(const char* s) " << s2 << endl;
	cout << "string(const string&s) " << s3 << endl;
}

运行结果:

 

了解
(constructor)函数名称功能说明
string(size_t n, char c)开辟n个空间,全部初始化为c
string(const string& str,size_t pos,size_t len=npos)从第pos个位置开始,拷贝len个字符
string(const char* s,size_t n)

去字符串前n个

int main()
{
	string s1("hello world");

	string s2(5, 'a');
	string s3(s1, 5, 6);
	string s4("hello", 4);
	cout << "string(size_t n, char c):" << s2 << endl;
	cout <<"string(const string& str,size_t pos,size_t len=npos):"<<s3 << endl;
	cout <<"string(const char* s,size_t n):"<< s4 << endl;
}

运行结果:

2.元素访问

operator[]重载[]号,可以利用下标直接获取改下标的字符,并且可以修改。
at与[]功能类似,如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。也支持修改。
back获取最后一个字符
front获取第一个字符

 

int main()
{
	string s1("hello world");
	cout << s1.at(1) << endl;
	cout << s1[1] << endl;
	cout << s1.front() << endl;
	cout << s1.back() << endl;

	s1[1] = '8';
	cout << s1 << endl;
	s1.at(1) = '0';
	cout << s1 << endl;
    return 0;
}

  运行结果:

3.迭代器(iterator)

迭代器可用来遍历和访问容器

迭代器有四种

iterator

const_iterator

reverse_iterator

const_reverse_iterator

begin返回第一个位置的迭代器(正向)
end返回最后一个位置的下一个位置的迭代器(正向)
rbegin返回最后一个位置的迭代器(反向)
rend返回第一个位置的迭代器(反向)
cbegin返回(const)第一个位置的迭代器(正向)
cend返回(const)最后一个位置的下一个位置的迭代器(正向)
crbegin返回(const)最后一个位置的迭代器(反向)
crend返回(const)第一个位置的迭代器(反向)

 

3.1 begin 和 end

迭代器实现遍历

方法一:

int main()
{
	string s1("hello world");

	string::iterator t = s1.begin();
	while (t != s1.end())
	{
		cout << *t;
		t++;
	}
	return 0;
}

运行结果:

方法二:

C++11支持

int main()
{
	string s1("hello world");

	for (auto c : s1)
	{
		cout << c;
	}
	return 0;
}

运行结果:

迭代器实现修改

int main()
{
	string s1("hello world");
	string s2("hello world");
	string::iterator t = s2.begin();
	while (t != s2.end())
	{
		(*t)++;
		cout << *t;
		t++;
	}
	cout << endl;
	for (auto& c : s1)//要加引用
	{
		c += 1;
		cout << c;
	}

	return 0;
}

运行结果:

3.2 rbegin 和 rend

反向遍历string

int main()
{
	string s("hello world");
	string::reverse_iterator t = s.rbegin();
	while (t != s.rend())
	{
		cout << *t;
		*t++;
	}
	return 0;
}

注意:尽管是反向迭代器,仍然是 *t++。

4.容器

size返回string的大小,与length无区别
length返回string的长度,与size无区别
max_size返回string可容纳的最大长度
resize

重新开辟空间

capacity返回当前string的容量
reserve可以提前开辟空间,扩大空间,可最小缩小空间到当前字符串的大小。
clear清除所有字符,但不修改容量
empty判断字符串是否为空

 

5.修改

operator+=在字符串后面添加字符或者字符串
append在字符串后面添加字符或者字符串
push_back将字符附加到字符串
assign将一个字符串分配给此字符串,覆盖赋值,会覆盖原先的字符串。
insert插入字符串
erase从字符串中删除字符串
replace替换字符串的一部分
swap交换字符串值
pop_back删除最后一个字符

 

5.1 append

int main()
{
	string s("hello world");
	s.append("6");
	cout << s << endl;
	s.append("999");
	cout << s << endl;
	return 0;
}

运行结果:

5.2 assign

int main()
{
	string s("hello world");
	s.assign("231");
	cout << s << endl;
	return 0;
}

运行结果:

5.3 insert

在pos之前位置插入字符串

实现头插:

int main()
{
	string s("hello world");
	s.insert(0, "hello mike");
	cout << s << endl;
	return 0;
}

运行结果:

5.4 erase

实现头删:
 

int main()
{
	string s("hello world");

	s.erase(0, 1);//在第0个位置删除1个字符
	cout << s << endl;
	return 0;
}

运行结果:

5.5 replace

int main()
{
	string s("hello world");

	s.replace(5, 1, "##");//从第5个开始的1个长度,替换为##
	cout << s << endl;
	return 0;
}

运行结果:

5.字符串操作

5.1 find

若成功找到,则返回所在字符串中的第一个位置,若没有找到,则返回string::npos

int main()
{
	string s("hello world");
	cout << s.find(" ") << endl;
	return 0;
}

运行结果:

int main()
{
	string s("hello world");
	if (s.find("asd") == string::npos)
	{
		cout << "string::npos" << endl;
	}
	return 0;
}

运行结果:

6.getline函数

6.1 第一种声明方式是传递三个参数。

istream& getline( istream& is, string& strs, char delim );

is:istream类的对象,定义从哪里读取输入流。

strs:存储字符串的string字符串。

delim:规定遇到什么字符停止。

int main()
{
	string s;
	getline(cin, s, '*');
	cout << s << endl;
	return 0;
}

 遇到*时停止输入。

运行结果:

 

6.2 第二种声明方式是传递两个参数

istream& getline( istream& is, string& str );

is:istream类的对象,定义从哪里读取输入流。

strs:存储字符串的string字符串。

两个参数时,默认遇到换行符时停止。


本篇完

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

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

相关文章

在C#中为图片添加数字水印的几种办法

最近在写个人项目时&#xff0c;有遇到需要将图片加上水印防止被盗取的需求。这里找了几种实现方式&#xff0c;可供有需要的朋友参考。 本身我不是搞算法这块的&#xff0c;所以这里只是找了一些实现&#xff0c;也没有继续深究下去。 以前在学校的时候从书上了解过可以将一…

cmake常用命令学习

1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件&#xff0c;而.cmake文件是一个模块文件&#xff0c;可以被include到CMakeLists.txt中。 include指令一般用于语句的复用&#xff0c;也就是说&#xff0c;如果有…

OBS Studio:如何打造专业级的视频直播体验

1.简介 OBS&#xff08;Open Broadcaster Software&#xff09;是一款开源的视频录制和直播软件&#xff0c;广泛用于视频制作、游戏直播和网络直播。它支持多种操作系统&#xff0c;包括Windows、macOS和Linux。OBS提供了丰富的功能&#xff0c;包括但不限于&#xff1a; **…

聊聊跨境电商平台与固定IP的那些事

IP地址网络地址&#xff08;网络号&#xff09;主机地址&#xff08;地址号&#xff09;&#xff0c;IP地址是一台电脑在网络中的唯一标识&#xff0c;可分为固定IP与动态IP。那么IP地址的分类有哪些&#xff1f;什么IP适合亚马逊/eBay/速卖通等平台运营时使用&#xff1f; A类…

Spring5 的日志学习

我们在使用 Spring5 的过程中会出现这样的现像&#xff0c;就是 Spring5 内部代码打印的日志和我们自己的业务代码打印日志使用的不是统一日志实现&#xff0c;尤其是在项目启动的时候&#xff0c;Spring5 的内部日志使用的是 log4j2&#xff0c;但是业务代码打印使用的可能是 …

DNS安全概述

一、DNS的解析过程 1.递归解析 递归解析是一种由DNS客户端&#xff08;通常是用户的应用程序&#xff0c;如一个浏览器&#xff09;向本地DNS解析器发出解析请求&#xff0c;然后本地DNS解析器负责查询最终结果并将结果返回给客户端&#xff0c;而中间的所有查询请求都由本地D…

每日OJ_牛客HJ62 查找输入整数二进制中1的个数

目录 牛客HJ62 查找输入整数二进制中1的个数 解析代码 牛客HJ62 查找输入整数二进制中1的个数 查找输入整数二进制中1的个数_牛客题霸_牛客网 解析代码 本题是计算一个数二进制表示中1的个数&#xff0c;通过&#xff08;n >> i) & 1可以获取第i位的二进制值&…

基于Spring boot + Vue的校园论坛

作者的B站地址&#xff1a;程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址&#xff1a;程序员云翼-CSDN博客 1.项目技术栈&#xff1a; 前后端分离的项目 后端&#xff1a;Springboot MybatisPlus 前端&#xff1a;Vue ElementUI 数据库&#xff1a; …

聚星文社 聚星3高级推理创作

聚星文社 聚星3高级推理创作 Docshttps://qvfbz6lhqnd.feishu.cn/wiki/D3YLwmIzmivZ7BkDij6coVcbn7W

CAS5.3自定义登录校验规则

前一篇文章介绍过CAS自定义用户信息, 这个用户信息实在登录成功后加到session中的, 今天来介绍一下CAS5.3怎么自定义登录校验逻辑 思路 有了前一篇文章的铺垫这一次自定义登录校验其实就很简单了, 因为想要把用户信息放入到session中是一定要在登陆的时候完成的,因此这次我们…

Codeforces Round 960 (Div. 2) A~E

A. Submission Bait &#xff08;思维&#xff09; 题意&#xff1a; A l i c e Alice Alice 和 B o b Bob Bob 正在玩一个数组 a a a 中大小为 n n n 的游戏。 他们轮流进行操作&#xff0c; A l i c e Alice Alice先开始。无法操作的玩家将输掉。首先&#xff0c;将变量…

常用控件之 QWidget

目录 一、控件概述 1.关于控件体系的发展&#xff1a; 二、QWidget 核心属性 1.核心属性概览 2.enabled 3.geometry &#x1f335;window frame&#xff08;窗口框架&#xff09; 的影响 4.windowTitle 5.windowIcon &#x1f335;使用 qrc 文件管理资源 6.windowOpa…

微信公众号上线12周年了,12年前的公众号历史文章怎么找?抓取了公众号历史文章同步到博客,找起来方便了

为了方便看看12年来这些号发过的文章 2023 批量下载公众号文章内容/话题/图片/封面/视频/音频&#xff0c;导出文章pdf和抓取文章数据包含阅读数/点赞数/在看数/留言数&#xff0c;我抓取了其中一些号的所有历史文章同步到博客 : 比如深圳卫健委从2014年更新&#xff0c;到2023…

Reqable:跨平台HTTP开发与调试工具

在当今快速发展的互联网时代&#xff0c;HTTP协议作为网络通信的基础&#xff0c;其开发和调试工具的选择对开发效率有着重要影响。本文将详细介绍一款新型的跨平台HTTP开发和调试工具——Reqable&#xff0c;它支持HTTP1、HTTP2以及最新的HTTP3(QUIC)协议&#xff0c;为开发、…

超秒集物:助力品牌商腾飞,共筑强国梦想

在当今竞争激烈的商业世界中&#xff0c;每一个小微企业都怀揣着成为世界 500 强的梦想。它们虽然微小&#xff0c;但都在努力绽放出属于自己的光芒。而超秒集物&#xff0c;以其独特的平台力量&#xff0c;为众多小微企业照亮了前行的道路&#xff0c;助力它们追逐梦想&#x…

贝叶斯之光:照亮机器学习领域的算法瑰宝

一、贝叶斯算法概述 贝叶斯算法起源于英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;在18世纪提出的贝叶斯定理。该定理是概率论中的一个重要定理&#xff0c;描述了条件概率之间的关系。其基本形式可以表示为&#xff1a; P(A∣B)P(B)P(B∣A)P(A)​ 其中&…

C++进阶:C++11新增语法(1)

文章目录 1. 统一的列表初始化1.1 &#xff5b;&#xff5d;初始化 1.2 std::initializer_list2. 声明2.1 auto2.2 decltype3.3 nullptr 4 范围for循环5 STL中一些变化6 右值引用和移动语义6.1 左值引用和右值引用6.2 左值引用与右值引用特性6.3 左值引用和右值引用使用场景和意…

图的应用--最小生成树

一. 前言 生成树的概念&#xff1a; 生成树是图的极小连通子图&#xff0c;也就是去掉一条边就非连通的图&#xff0c;并且这个图的所有顶点都由边连接在一起&#xff0c;但不存在回路。 生成树的特点&#xff1a;一个图可以有很多个不同的生成树。生成树的顶点个数和图的顶点个…

另一棵树的子树 - 力扣(LeetCode)C语言

572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&…

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…