标准库中的string类

news2024/11/23 8:30:04

深爱学习的你,在很多场景下一定经常和字符串打交道!

字符串是以‘\0’结尾的字符合集,C语言中提供了一些库函数来处理字符串,让大家在写代码的过程中方便了许多:

字符串函数_Bug程序员小张的博客-CSDN博客字符串函数https://blog.csdn.net/weixin_59351791/article/details/126497146?spm=1001.2014.3001.5502但是,这些库函数和字符串是分离开的,不太符合C++面向对象编程的思想。所以,C++标准库中提供了string类,也就是表示字符串的字符串类!对于常规的字符串操作问题使用string类,更加的简单、方便、快捷。


目录

string类的常用接口

string类对象的常见构造

string对象的容量操作

 string类的访问及遍历

string类对象的修改操作

非成员函数重载 


string类的常用接口

string类对象的常见构造

https://cplusplus.com/reference/string/string/string/https://cplusplus.com/reference/string/string/string/

#include <iostream>
using namespace std;

int main()
{
	string s1; //构造空string类对象
	string s2("zxy hi!");//用字符串构造string类对象
	string s3(s2);//拷贝构造
	
	cout << s1.c_str() << endl;
	cout << s2.c_str() << endl;
	cout << s3.c_str() << endl;

	return 0;
}

 c_str()接口功能是返回C格式字符串,这里了解即可,后面会继续测试。

string对象的容量操作

 size()/length():

两者的功能都是获取字符串有效长度,底层实现原理完全相同。size()是后引入的,引入同功能接口的原因是为了与其他容器接口保持一致。

int main()
{
	string s("zhang xi yang");
	cout << s.c_str()<<endl;
	cout <<"length():" << s.length() << endl;
	cout <<"size():" << s.size() << endl;
	return 0;
}

clear():清空有效字符,size清零。

int main()
{
	string s("zxy");
	cout << s.size() << endl;
	cout << s.c_str() << endl;
	s.clear();
	cout << s.size() << endl;
	cout << s.c_str() << endl;
	return 0;
}

 

resize():将有效字符的个数改成n个,多出的空间用字符填充。

 功能都是将字符串的有效字符个数变为n个,resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。

int main()
{
	string s("zxy");
	cout << s.size() << endl;
	cout << s.c_str() << endl;
	
	s.resize(20,'*');
	cout << s.size() << endl;
	cout << s.c_str() << endl;
	return 0;
}

 

capacity():  返回空间总大小。

int main()
{
	string s("zxy");
	cout <<"容量:" << s.capacity() << endl;
	cout << "字符串长度:" << s.size() << endl;
	cout <<"字符串:" << s.c_str() << endl;
	cout << "---------------------------"<<endl;
	s.resize(16,'x');
	cout << "容量:" << s.capacity() << endl;
	cout << "字符串长度:" << s.size() << endl;
	cout << "字符串:" << s.c_str() << endl;
	return 0;
}

 

reserve():为字符串预留空间。

不会改变有效元素个数!当传入参数大于容量是会扩容,小于容量是并不会缩容,而是保持原容量不变。

int main()
{
	string s("zxy");
	cout << "容量:" << s.capacity() << endl;
	cout << "字符串长度:" << s.size() << endl;
	cout <<"字符串:" << s.c_str() << endl;

	cout << "-----测试参数大于string容量-----" << endl;
	s.reserve(100);
	cout << "容量:" << s.capacity() << endl;
	cout << "字符串长度:" << s.size() << endl;
	cout << "字符串:" << s.c_str() << endl;
	
	cout << "-----测试参数小于string容量-----" << endl;
	s.reserve(50);
	cout << "容量:" << s.capacity() << endl;
	cout << "字符串长度:" << s.size() << endl;
	cout << "字符串:" << s.c_str() << endl;
	
	return 0;
}

 ■empty():判断字符串是否为空,空返回false,非空返回true!

int main()
{
	string s("Hello world!");
	cout << s.empty() << endl;

	s.clear();

	cout << s.empty() << endl;
	return 0;
}

 string类的访问及遍历

operator[].

int main()
{
	string s("ZhangXiY");
	for (int i = 0; i < s.size(); ++i)
	{
		cout << s[i] << " ";
	}
	cout << endl;
	return 0;
}

begin()/end() 和 rbegin()/rend() 。 两组接口的区别如下:

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

	string::iterator it1 = s.begin();
	for (it1 = s.begin(); it1 != s.end(); it1++)
	{
		cout << *it1 << "-";
	}
	cout <<endl<<"----------------" << endl;

	string s2("HELLO!");
	string::reverse_iterator it2 = s2.rbegin();
	for (it2 = s2.rbegin(); it2 != s2.rend(); it2++)
	{
		cout << *it2 << "-";
	}
	return 0;
}

 ■范围for

C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围。

 
//范围for
int main()
{
	int arr[10] = {0,1,2,3,4,5,6,7,8,9};
	for (auto e : arr)
	{
		cout << e << " ";
	}
	return 0;
}

需要注意,如果想要改变数组中元素的值,就要将auto改成auto&.

int main()
{
	int arr[10] = {0,1,2,3,4,5,6,7,8,9};
	for (auto e : arr)
	{
		cout << e << " ";
	}
	cout << endl << "-----------auto-------------" << endl;
	for (auto e : arr)
	{
		e++;

	}
	for (auto e : arr)
	{
		cout << e << " ";
	}
	cout << endl<< "-----------auto&-------------"<<endl;
	for (auto& e : arr)
	{
		e++;

	}
	for (auto e : arr)
	{
		cout << e << " ";
	}
	return 0;
}

 注意:范围for迭代的范围必须是确定的!对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,begin和end就是for循环迭代的范围。

如下代码就是有问题的:

#include <iostream>
using namespace std;

void Test(int Arr[])
{
	for (auto& e : Arr)
	{
		cout << e << endl;
	}
}
int main()
{
	int arr[] = {2,3,2,3,4,5};
	
	Test(arr);
	return 0;
}

 

string类对象的修改操作

 ■ operator+=/append()/push_back().

在string尾部追加字符时,s.push_back(c) / s.append() / s += 'c'三种的实现方式差不多。+=操作用的相对多一些,+=操作不仅可以连接单个字符,还可以连接字符串。
int main()
{
	cout << "-----push_back-----" << endl;
	string s1("zxy");
	s1.push_back(' ');
	s1.push_back('b');
	s1.push_back('c');
	cout << s1.c_str() << endl;
	
	cout << "-------append------" << endl;
	string s2("Hello ");
	s2.append("World!");
	cout << s2.c_str() << endl;
	
	cout << "-----operator+=-----" << endl;
	string s3("Hi ");
	s3 += 'z';
	cout << s3.c_str() << endl;
	s3 += "xy";
	cout << s3.c_str() << endl;

	return 0;
}

c_str()

 返回指向string对象值的c-string表示形式的指针

npos()

 npos是一个静态成员常量值,对于size_t类型的元素具有最大的可能值。

 ■find()/rfind()

正向和反向查找,从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置!

int main()
{
    std::string str1("Looking back at all the excitement in the past years, you still won the top spot.");
    std::string str2("still");

    size_t found1 = str1.find(str2);
    if (found1 != string::npos)
    {
       cout << "从前向后找,找到了 " << found1 << '\n';
    }
    else
    {
        cout << "没找到哦!" << endl;
    }
    size_t found2 = str1.rfind(str2);
    if (found2 != string::npos)
    {
        cout << "从后向前找,找到了 " << found2 << '\n';
    }
    else
    {
        cout << "没找到呀!" << endl;
    }

    return 0;
}

非成员函数重载 

>>和<<重载

int main()
{
	string str("zxy");
	cout << str << endl;
	string str1;
	cin >> str1;
	cout << str1 << endl;
	return 0;
}

getline()

int main()
{
	string name;

	getline(std::cin, name);
	cout << "I Love You:" << name <<endl;

	return 0;
}

 ■relational operators()

字符串的关系运算符,在字符串对象str1和str2之间执行适当的比较操作。

int main()
{
	string foo = "clpha";
	string bar = "betasss";

	if (foo == bar) cout << "foo == equal";
	if (foo != bar)cout << "foo != equal\n";
	if (foo < bar) cout << "foo < bar\n";
	if (foo > bar) cout << "foo > bar\n";
	if (foo <= bar) cout << "foo <= bar\n";
	if (foo >= bar) cout << "foo >= bar\n";

	return 0;
}

 ■字符串翻转:reverse()

int main()
{

	string s("hello world!");
	cout << s << endl;
	reverse(s.begin(),s.end());
	cout << s << endl;

	return 0;
}

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

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

相关文章

基于Simulink的带通BPSK信号调制解调实验报告(含代码和slx文件)

重要声明:为防止爬虫和盗版贩卖,文章中的核心代码和数据集可凭【CSDN订阅截图或公z号付费截图】私信免费领取,一律不认其他渠道付费截图! 摘要 数字相位调制又称为相移键控(Phase Shift Keying,PSK),是一种十分重要的基本数字调制技术,是一种用载波相位表示输入信号…

磨金石教育摄影技能干货分享|有哪些风格独特的摄影作品

1 奋勇向前照片中退却的海浪与冲上岸的海浪交汇拍打&#xff0c;形成大量的白色泡沫。于是画面被平均分成两部分&#xff0c;分割线由左上延伸到右下&#xff0c;一条明显的对角线。也让画面形成对称式的构图&#xff0c;所以照片看着既平衡又美观。作者给照片起名为《奋勇向前…

Docker安装MySQL、MySQL主从复制、双主双从

文章目录Docker安装MySQL新建容器配置,记得 重启加载配置&#xff01;测试MySQL 主从复制原理新增两个mysql,一主一从在主机上在从机上MySQL双主双从必看&#xff01;创建容器在两个主机上在两个从机上问题解决Navicat无法连接MySQL的问题WARNING: IPv4 forwarding is disabled…

计算机网络概况

1 前言计算机网络是指将位于不同地理位置&#xff0c;但具有独立功能的多台设备&#xff0c;通过通信设备和线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件、网络通信协议的协调管理下&#xff0c;实现资源共享和信息传递的计算机系统。简单来说&#xff0c;…

智慧农业灌溉系统-数字农业-农业物联网机井灌溉节水新模式

平升电子智慧农业灌溉系统/农业物联网机井灌溉系统&#xff0c;可实现井电双控&#xff08;以电控水&#xff09;、以电折水、以阀控水等各种形式的地下取水井用水计量监测控制需求&#xff0c;助推农业水价改革实施、高效节水灌溉和地下水超采综合治理&#xff0c;促进节水型社…

Python数学建模问题总结(2)数据可视化Cookbook指南·上

概括总结&#xff1a;一、可视化问题1.不会可视化图标&#xff1b;2.可视化效果不好看&#xff1b;3.数据可视化成果无法得到很好的推广使用。二、可视化原则准确的、有帮助的、可扩展的。三、类型1.随时间变化&#xff1b;2.类别比较图表&#xff1b;3.排名列表&#xff1a;有…

proc文件系统下各参数解析

文章目录一、proc文件系统1.1 /proc/[pid]1.1.1 /proc/[pid]/arch_status1.1.2 /proc/[pid]/attr1.1.2.1 /proc/[pid]/attr/current1.1.2.2 /proc/[pid]/attr/exec1.1.2.3 /proc/[pid]/attr/fscreate1.1.2.4 /proc/[pid]/attr/keycreate1.1.2.5 /proc/[pid]/attr/prev1.1.2.6 /…

【操作系统】 第一章 操作系统概述

文章目录第一章 知识体系1.1 操作系统的基本概念1.1.1 操作系统的概念1.1.2 操作系统的特征1.1.3 操作系统的目标和功能1.2 操作系统的发展历程1.3 操作系统的运行环境1.3.1 处理器的运行模式1.3.2 中断和异常的概念1.3.3 系统调用1.4 操作系统结构1.5 操作系统引导1.6 虚拟机第…

C++进阶 红黑树封装map和set

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;使用红黑树封装出map和set 红黑树封装map和set红黑树源代码红黑树模板参数的控制红黑树结点当中存储的数据模板参数仿函数的增加正向迭…

react基础Day04-React原理揭秘React路由基础

React原理揭秘 目标 能够说出React组件的更新机制能够对组件进行性能优化能够说出虚拟DOM和DIff算法 组件更新机制 setState() 的两个作用 修改state更新组件 过程&#xff1a;父组件重新渲染时&#xff0c;也会重新渲染子组件&#xff0c;但只会渲染当前组件子树&#xff…

[Android Studio]查看和修改Android API SDK的配置

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…

高并发系统设计 -- 缓存与数据库一致性问题详细讲解

CAP理论 首先来谈一下数据的一致性这个话题&#xff0c;所谓的一致性就是数据保持一致&#xff0c;在分布式系统中&#xff0c;可以理解为多个节点中的数据的值是一致的。 强一致性&#xff1a;这种一致性级别是最符合用户直觉的&#xff0c;它要求系统写入什么&#xff0c;读…

steam搬砖项目,信息差赚钱,内含全部讲解

Steam平台就是一个全球的游戏平台&#xff0c;搬砖主要是搬的一款火遍全球的游戏CSGO的装备和饰品。CS听说过吧&#xff0c;这款游戏就是CS的一个系列。&#xff08;通俗易懂的理解就是&#xff0c;从国外steam游戏平台购买装备&#xff0c;再挂到国内网易buff平台上进行售卖。…

【TypeScript】TS进阶-装饰器(九)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff1a;vue3从入门到…

ADI demo PL工程的编译-以adrv9371x_zc706为例子之使用Cygwin

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ADI demo PL工程的编译-以adrv9371x_zc706为例子之使用Cygwin前言Cygwin 安装工程编译总结前言 之前一篇ADI demo工程的编译是ADI不推荐的方法&#xff0c;而且确实在后面NO…

【Django项目开发】django的信号机制(八)

文章目录1、什么是信号2、代码实现3、要想上面定义的信号机制生效,需要在apps.py中加载信号机制1、什么是信号 通俗来说,信号就是通信双方约定的一种信息通知方式,双方通过信号来确定发生了什么事情,然后决定自己应该做什么。 Django 中的信号用于在框架执行操作时解耦。当某…

2.1总线概述

文章目录一、总线简图二、概念与分类1.总线定义2.总线特点&#xff08;1&#xff09;分时&#xff08;2&#xff09;共享3.总线特性4.总线的分类&#xff08;1&#xff09;按数据传输格式①串行总线②并行总线&#xff08;2&#xff09;按总线功能①片内总线②系统总线③通信总…

【原创】linux实时应用如何printf输出不影响实时性?

linux实时应用printf输出 文章目录linux实时应用printf输出1. 前言2. linux终端输出3. 常见的NRT IO输出方案3.1 一种实现方式3.3 改进3. Xenomai3 printf()接口3.1 应用运行前环境初始化1. GCC特定语法2. libcobalt printf初始化流程3.2 libcobalt printf内存管理1. print_buf…

我的周刊(第074期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目code-server[1]这是一款开源的基于 VSCode 的在线编…

【Linux系统】第四篇:Linux中编辑器vim的使用

文章目录一、vim的介绍1、vim的基本模式2、vim的使用二、命令模式1、光标移动操作2、文本复制、粘贴、剪切、撤销操作3、文本编辑相关操作三、插入模式四、底行模式底行模式命令集五、vim的配置原理六、sudo无法提权问题一、vim的介绍 vim是Linux下的一款多模式编辑器。 注意…