STL-String容器

news2024/11/19 23:41:23

string本质上是一个类,string 类内部封装了很多成员方法

例如:查找find,拷贝copy,删除delete 替换replace,插入insert

string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

目录

string构造函数

string赋值操作

string字符串拼接

string查找和替换

string字符串比较

string字符存取

string插入和删除

string子串


string构造函数

string();                          //创建一个空的字符串 例如: string str;
string(const char* s);             //使用字符串s初始化
string(const string& str);         //使用一个string对象初始化另一个string对象
string(int n, char c);             //使用n个字符c初始化 

示例:

#include <vector>
#include<algorithm>
#include<iostream>
using namespace std;
#include <string>
//string构造
void test01()
{
	string s1; //创建空字符串,调用无参构造函数
	cout << "str1 = " << s1 << endl;

	const char* str = "hello world";
	string s2(str); //把c_string转换成了string

	cout << "str2 = " << s2 << endl;

	string s3(s2); //调用拷贝构造函数
	cout << "str3 = " << s3 << endl;

	string s4(10, 'a');
	cout << "str3 = " << s3 << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

 对应输出


string赋值操作

 赋值的函数原型:

string& operator=(const char* s);           //char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);         //把字符串s赋给当前的字符串
string& operator=(char c);                  //字符赋值给当前的字符串
string& assign(const char *s);              //把字符串s赋给当前的字符串
string& assign(const char *s, int n);       //把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s);            //把字符串s赋给当前字符串
string& assign(int n, char c);              //用n个字符c赋给当前字符串

示例:

void test01()
{
	string str1;
	str1 = "hello world";
	cout << "str1 = " << str1 << endl;

	string str2;
	str2 = str1;
	cout << "str2 = " << str2 << endl;

	string str3;
	str3 = 'a';
	cout << "str3 = " << str3 << endl;

	string str4;
	str4.assign("hello c++");
	cout << "str4 = " << str4 << endl;

	string str5;
	str5.assign("hello c++", 5);
	cout << "str5 = " << str5 << endl;


	string str6;
	str6.assign(str5);
	cout << "str6 = " << str6 << endl;

	string str7;
	str7.assign(5, 'x');
	cout << "str7 = " << str7 << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

运行结果

string字符串拼接

string& operator+=(const char* str);    //重载+=操作符
string& operator+=(const char c);       //重载+=操作符
string& operator+=(const string& str);  //重载+=操作符
string& append(const char *s);          //把字符串s连接到当前字符串结尾
string& append(const char *s, int n);   //把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);        //同operator+=(const string& str)
string& append(const string &s, int pos, int n);//字符串s中从pos开始的n个字符连接到字符串结尾

示例

void test01()
{
	string str1 = "1";

	str1 += "2345";

	cout << "str1 = " << str1 << endl;

	str1 += ':';

	cout << "str1 = " << str1 << endl;

	string str2 = "678 9";

	str1 += str2;

	cout << "str1 = " << str1 << endl;

	string str3 = "a";
	str3.append(" bcdef ");
	str3.append("ghi jk", 4);
	//str3.append(str2);
	str3.append(str2, 4, 3); // 从下标4位置开始 ,截取3个字符,拼接到字符串末尾
	cout << "str3 = " << str3 << endl;
}
int main() {

	test01();

	system("pause");

	return 0;
}

运行结果 

 string查找和替换

查找:查找指定字符串是否存在
替换:在指定的位置替换字符串

int find(const string& str, int pos = 0) const;          //查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const;              //查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const;           //从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const;               //查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const;      //查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;          //查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;          //从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const;              //查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str);      //替换从pos开始n个字符为字符串str
string& replace(int pos, int n,const char* s);           //替换从pos开始的n个字符为字符串s

示例:

void test01()
{
	//查找
	string str1 = "abcdefgde";

	int pos = str1.find("de");

	if (pos == -1)
	{
		cout << "未找到" << endl;
	}
	else
	{
		cout << "pos = " << pos << endl;
	}


	pos = str1.rfind("de");

	cout << "pos = " << pos << endl;

}

void test02()
{
	//替换
	string str1 = "abcdefgde";
	str1.replace(1, 3, "12345");

	cout << "str1 = " << str1 << endl;
}

int main() {

	test01();
	test02();
	system("pause");

	return 0;
}

运行结果:

find查找是从左往后,rfind从右往左
replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串

string字符串比较

字符串比较是按字符的ASCII码进行对比

= :返回   0     \> :返回   1     < :返回  -1

* `int compare(const string &s) const; `  //与字符串s比较
* `int compare(const char *s) const;`      //与字符串s比较

示例:

void test01()
{

	string s1 = "abcde";
	string s2 = "abcde";

	int ret = s1.compare(s2);

	if (ret == 0) {
		cout << "s1 等于 s2" << endl;
	}
	else if (ret > 0)
	{
		cout << "s1 大于 s2" << endl;
	}
	else
	{
		cout << "s1 小于 s2" << endl;
	}

}

int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

 一般用于判断两个字符串是否相等

 string字符存取

string中单个字符存取方式有两种

char& operator[](int n);      //通过[]方式取字符
char& at(int n);                   //通过at方法获取字符

示例:

void test01()
{
	string str = "hello world";

	for (int i = 0; i < str.size(); i++)//在每个字符后面加空格
	{
		cout << str[i] << " ";
	}
	cout << endl;

	for (int i = 0; i < str.size(); i++)//在每个字符后面加空格
	{
		cout << str.at(i) << " ";
	}
	cout << endl;


	//字符修改
	str[0] = 'x';
	str.at(1) = 'x';
	cout << str << endl;

}
int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

 string插入和删除

string& insert(int pos, const char* s);             //插入字符串
string& insert(int pos, const string& str);         //插入字符串
string& insert(int pos, int n, char c);             //在指定位置插入n个字符c
string& erase(int pos, int n = npos);               //删除从Pos开始的n个字符 

示例:

void test01()
{
	string str = "abcde";
	str.insert(1, "12345");
	cout << str << endl;

	str.erase(1, 3);  //从1号位置开始3个字符
	cout << str << endl;
}
int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

 string子串

 从字符串中获取想要的子串

string substr(int pos = 0, int n = npos) const;`   //返回由pos开始的n个字符组成的字符串

示例:

void test01()
{

	string str = "abcdefg";
	string subStr = str.substr(1, 3);
	cout << "subStr = " << subStr << endl;

	string email = "hello@sina.com";
	int pos = email.find("@");
	string username = email.substr(0, pos);//找到@之前的字符
	cout << "username: " << username << endl;

}
int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

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

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

相关文章

C++容器适配器stack和queue(含deque,priority_queue)

目录 1.容器适配器 1.1 什么是适配器 1.2 STL标准库中stack和queue底层结构 1.3 deque 1.3.1 deque原理介绍&#xff08;了解&#xff09; 1.3.2 deque优点和缺点 1.3.3 为什么选择deque作为stack和queue的底层默认容器 2. stack介绍和使用 2.1 stack介绍 2.2 stack使用 2.3 …

HTML处理控件Aspose.Html 功能演示:在 C# 中将 HTML 转换为 JPG

Aspose.Html for .NET 是一种高级的HTML操作API&#xff0c;可让您直接在.NET应用程序中执行广泛的HTML操作任务&#xff0c;Aspose.Html for .NET允许创建&#xff0c;加载&#xff0c;编辑或转换&#xff08;X&#xff09;HTML文档&#xff0c;而无需额外的软件或工具。API还…

swing基本组件用法_JTooBar

Swing提供了JTooBar类来创建工具条&#xff0c;并且可以往JTooBar中添加多个工具按钮 JToolBar API: 方法名称方法功能JToolBar(String name,int orientation)创建一个名为name&#xff0c;方向为orientation的工具条对象&#xff0c;其orientation的是取值可以是SwingConsta…

MySQL基础(九)子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询&#xff0c;这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了 SELECT 查询的能力&#xff0c;因为很多时候查询需要从结果集中获取数据&#xff0c;或者需要从同一个表中先计算得出一个数据结果&#xff0c;然…

单调队列解决滑动窗口问题

文章目录 单调队列结构解决滑动窗口问题什么是单调队列&#xff1f;[239. 滑动窗口最大值](https://leetcode.cn/problems/sliding-window-maximum/)单调队列框架滑动窗口解题框架完整的解题代码如下&#xff1a;我的实现&#xff1a; 单调队列结构解决滑动窗口问题 什么是单调…

CVE-2023-27524 Apache Superset Auth Bypass|附检测工具

漏洞描述 Apache Superset是一个开源数据可视化和探索工具。Apache Superset 版本&#xff08;包括 2.0.1&#xff09;中的会话验证攻击。没有根据安装说明更改默认配置的SECRET_KEY的安装允许攻击者验证和访问未经授权的资源。这不会影响更改了SECRET_KEY配置默认值的Superse…

JAVA快速开发框架 一键生成表单模板代码

从计算机诞生开始&#xff0c;虽然编程的形式随着硬件及软件的不断进步而不停迭代&#xff0c;但是从事计算机技术行业的人员始终与编写代码的任务紧密联系在一起。因此如何提高软件开发的效率和质量&#xff0c;一直是软件工程领域的重要问题之一。 这一方面是由于在不同软件…

MQ(面试问题简析)学习笔记

文章目录 1. 为什么使用消息队列2. 消息队列有什么优缺点3. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点&#xff1f;4. 如何保证消息队列的高可用4.1 RabbitMQ 的高可用性4.2 Kafka 的高可用性 5. 如何保证消息不被重复消费&#xff08;如何保证消息消费的幂等性&#…

1、Cloudsim和Workflowsim仿真环境下载

1、WorkflowSim的下载和安装 workflowsim下载地址 2、Cloudsim的下载和安装 cloudsim官网 cloudsim4.0安装包地址 2、Cloudsim如何工作 Cloudsim如何工作&#xff1f;原版内容 cloudsim配置 下面这是CloudsimExamples1的代码&#xff1a; package org.cloudbus.…

论文导读 | 大语言模型上的精调策略

随着预训练语言模型规模的快速增长&#xff0c;在下游任务上精调模型的成本也随之快速增加。这种成本主要体现在两方面上&#xff1a;一&#xff0c;计算开销。以大语言模型作为基座&#xff0c;精调的显存占用和时间成本都成倍增加。随着模型规模扩大到10B以上&#xff0c;几乎…

SpringBoot启用web模拟测试(一)

添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.10</version> </dependency> 模拟端口 虚拟请求测试 Slf4j RestController RequestMappin…

java后端面试大全,java后端面试宝典

JAVA_LEARNING_CONTENT JAVA后端面试大全&#xff0c;java后端面试宝典 一个分布式锁的解决方案&#xff0c;另一个是分布式事务的解决方案 -2 flink 链接&#xff1a;flink参考文章 -1 linux of view 参考链接&#xff1a; linux常见面试题 linux查看占用cup最高的10个进…

机电设备故障ar远程维修软件缩短生产线中断时间

电机属于工业生产中的关键设备之一&#xff0c;处于长期运转阶段&#xff0c;因此电机容易出现故障&#xff0c;极易增加企业生产成本&#xff0c;影响生产计划。引进AR远程维修技术效果显著。 AR远程维修技术是一种将虚拟信息与实际场景相结合的技术。当电机出现故障时&#x…

基于AT89C51单片机的交通灯设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87763760?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 设计一个能够控制十二盏交通信号灯的模拟系统,:利用单片机的定时器定时&#xff0c;令十字路口…

云原生-kubesphere容器平台

https://www.yuque.com/leifengyang/oncloud/gz1sls 多租户&#xff1a;可以用户自定义注册进来&#xff0c;可以给用户分配一些集群操作权限&#xff0c;来操作集群 多集群&#xff1a;有生产环境的k8s集群和测试环境的k8s集群。这多个集群都是需要管理的&#xff0c;可以安装…

Error: (‘IM002‘, ‘[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序‘)

这是使用pypyodbc访问access数据库时常见的一个错误。 大致可以分为以下几个原因&#xff1a; 1.驱动程序不全&#xff1b; 2.你的驱动源名称错误&#xff1b; 3.python位数与驱动位数不同&#xff0c;这也可以粗暴的归类为原因1. 那么如何解决&#xff1f; 找到对应的驱…

ce人造指针

人造指针 找出什么访问 重开会改变edi 记录传入的edi 视图 内存区域ctrlr 可读可写 在0079B000前找空的 可以用只读 fullaccess(00xxxxxx,4)有可能处于保护&#xff0c;不起效果 在申请地址造指针 全局用 registersymbol() unregistersymbol(mana_ecx) ceaa od …

谷歌云 | 授权用户访问您在 Cloud Run 上的私有工作负载的 3 种新方法

【本文由 Cloud Ace 云一整理】 越来越多的组织正在Cloud Run上构建应用程序&#xff0c;这是一个完全托管的计算平台&#xff0c;可让您在 Google 的基础架构之上运行容器化应用程序。想想 Web 应用程序、实时仪表板、API、微服务、批量数据处理、测试和监控工具、数据科学推…

【ADS867x】双极输入范围 14 位 500kSPS 4/8 通道、单电源 SAR ADC

器件特性 具有集成模拟前端的 14 位模数转换器 (ADC)具有自动和手动扫描功能的 4 通道、8 通道多路复用器通道独立可编程输入&#xff1a; 10.24V、5.12V、2.56V、1.28V、0.64V10.24V、5.12V、2.56V、1.28V 5V 模拟电源&#xff1a;1.65V 到 5V I/O 电源恒定的阻性输入阻抗&am…

Android Dialog之DialogFragment详解与使用

一、介绍 在Android开发过程中&#xff0c;经常会有弹窗业务&#xff0c;在正常的弹窗业务中&#xff0c;常用到的是Dialog&#xff0c;Dialog的原理也是通过将view&#xff0c;添加到Dialog中。Dialog自身是一个独立的窗口&#xff0c;和Activity一样&#xff0c;有自己的wind…