C++---string类常见接口

news2024/11/18 15:51:39

介绍

 string类详情===>>>https://cplusplus.com/reference/string/string/?kw=string

1. string是表示字符串的字符串类(感觉就像一个动态的字符数组)
2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
4. 不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#include头文件以及using namespace std;

string类的常用接口说明

1 string类常用构造函数

1.1 string()

定义一个空字符串,直接使用就行。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s1;
    return 0;
}

1.2 string(const char* s)

#include <iostream>
#include <string>
using namespace std;
int main()
{

    const char *ch="hello world";
    string s1("hello world");
    string s2(ch);
    
    return 0;
}

1.3 string(size_t n, char c)

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s(3, 'a'); //3个a字符
    cout << s;
    return 0;
}

1.4 string(const string&s)

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s(3, 'a');
    string s1 = s;//定义变量时候的=就是拷贝构造
    cout << s;

    string s2;
    s2 = s;//定义完了之和的=是调用的运算符重载operator=()

    return 0;
}

2 string类对象的容量操作

2.1 size/length

	string s1("hello world");
	string s2("hello");
	cout << s1.size() << endl; //11
	cout << s2.length() << endl; //5

    //size和length本质没啥区别,只是谁先被创造出来的差别而已

2.2 capacity

string s1("hello world");
cout << s1.capacity() << endl; //15

//实际容量一般比capacity多一个,用于存储'\0'

capacity与size的区别:capacity是容量,表示总共最多能装多少个字符,而size是表示字符串的有效字符的数量,则capacity>=size。

在实际扩容中,为了提高效率,capacity的增长是按照一定比率增长的,在VS中,大概为1.5倍增长。

2.3 clear

string s1("hello world");
cout << s1  << endl; //hello world
s1.clear();
cout << s1  << endl; //空

2.4 reserve

string s;//创建一个s空字符串
s.reserve(100);//提前为 s 开辟100个空间
cout<<s.size()<<endl;//0
cout << s.capacity() <<endl;//111

 reserve只会开辟空间,并不会改变字符串有效字符内容。reserve开辟的空间要比string底层空间要大,如果传入参数小于string底层空间大小的话则为无效开辟。

2.5 resize

两种方式:

resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字
符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的
元素空间。

注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大
小,如果是将元素个数减少,底层空间总大小不变。

3 string类对象的访问和遍历

3.1 operator[] 

for (int i = 0; i < s3.size(); i++)
	{
		s3[i] += 2;
	}

[]的运算符重载,可以直接将string类对象当数组一样用下标访问。

3.2 begin+ end

//迭代器
	string::iterator it = s3.begin();
	while (it != s3.end())//写
	{
		*it -= 2;
		it++;
	}
	it = s3.begin();//置为起点
	while (it != s3.end())//读   end为数组末尾的下一个位置
	{
		cout << *it << " ";
		it++;
	}

begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器

3.3 rbegin + rend

string s1("hello world");
	string::reverse_iterator  rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;

4 string类对象的修改操作

4.1 push_back

string s;
s.push_back('c');

在字符串后插入c

4.2 append

string s;
s.append("123");

在字符串后追加一个字符串

4.3 operator+=

string s;
s += '8';
s += "sda";
//s: 8sda

在字符串后追加字符串str

在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

4.4 insert 

string s("hello world");
s.insert(s.begin(), 's');
//s: shello world

在下标为pos之前插入字符串。

4.5 erase

string s("xxxhello world");
s.erase(0,3);//前面的 0 是位置,后面的3是需要删除的字符个数
cout << s << endl; //hello world

从某个位置开始删除几个字符,如果字符不够删,则有多少删多少

4.6 c_str

string s1("sdjsd");
	const char* str = s1.c_str();
	while (*str)
	{
		cout << *str << " ";
		str++;
	}
	cout << endl;

返回首地址。

4.7 find + npos

string s("hello world");
int pos = s.find(' ');//找到‘ ’的位置
cout << s.substr(pos+1)<<endl;//world
int pos1 = s.find('l', pos);//从pos开始找l
cout << s.substr(pos1)<<endl;//ld

4.8 rfind

int pos2=s.rfind('l');
cout << s.substr(pos2)<<endl;
int pos3 = s.rfind('l', pos2-1);
cout << s.substr(pos3)<<endl;

rfind和find类似,find是从往右找,rfind是从右往左找。

4.9 substr

string s("hello world");
int pos = s.find(' ');//找到‘ ’的位置
cout << s.substr(pos+1)<<endl;//world
int pos1 = s.find('l', pos);//从pos开始找l
cout << s.substr(pos1)<<endl;//截取pos1开始到最后的字符段

在str中从pos位置开始,截取n个字符,然后将其返回。

5 string类非成员函数

5.1 operator+

尽量少用,因为传值返回,导致深拷贝效率低

5.2 operator>>

输入符重载

5.3 operator<<

输出运算符重载

5.4 getline

getline与cin类似但不相同,cin输入时遇到空格或者遇到换行符就会停止读入,而getline不会。

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

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

相关文章

9月19日与MongoDB相约2024云栖大会

2024云栖大会来了&#xff01; 9月19日至9月21日 在杭州云栖小镇召开 汇集全球最新云计算和AI硬科技 MongoDB互动展区 2号馆2-8展区 MongoDB技术演讲 9月20日 分论坛&#xff1a;D2-5 2024云栖大会将设置 人工智能、计算、前沿应用三大主题馆&#xff0c; 围绕云计算与AI&#…

面试官:说说停止线程池的执行流程?

对于我们使用的线程池 ThreadPoolExecutor 来说&#xff0c;停止线程池的方法有以下两个&#xff1a; shutdown()&#xff1a;优雅的关闭线程池&#xff0c;即不再接受新任务&#xff0c;但会等待已提交任务&#xff08;包括正在执行的任务和在队列中等待的任务&#xff09;执行…

【C++高阶】解锁C++的深层魅力——探索特殊类的奥秘

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 类型转换 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C特殊类 &#x1f4d2;1. 不能被拷贝…

外贸网站建设该怎么做

外贸网站已成为企业拓展国际市场、促进贸易合作的重要工具。然而&#xff0c;要想在竞争激烈的国际贸易舞台上脱颖而出&#xff0c;就需要一套科学有效的外贸网站建设方案。本文将为您介绍成功打造外贸网站的关键步骤&#xff0c;助您在数字化时代实现更广阔的国际商机。 第一步…

嗨! 大叔,什么时候退休?

先祝各位中秋快乐&#xff01;&#xff01;&#xff01;接下我们吃瓜。娱乐至上&#xff01; 纯属娱乐&#xff0c;没验证是否正确&#xff01; 2024年9月13日第十四届全国人民代表大会常务委员会第十一次会议通过关于实施渐进式延迟法定退休年龄的决定,我将规则给ChatGPT&am…

如何绕过Cloudflare的403 禁止错误?

Cloudflare 的 403 错误与常规 HTTP 403 错误代码并无二致&#xff0c;都表示禁止访问。这通常意味着你没有权限访问该文档。然而&#xff0c;在使用 Cloudflare 的情况下&#xff0c;当你尝试网页抓取时&#xff0c;可能会遇到这种情况&#xff0c;因为它可能表明你的 IP 地址…

【练习10】链表相加

链接&#xff1a;链表相加(二)_牛客题霸_牛客网 (nowcoder.com) 分析&#xff1a; 算法原理是逆序高精度算法 逆序的原因是为了实现从低位&#xff08;个位&#xff09;开始相加。 public class Solution {//逆序链表public ListNode reverse(ListNode head){ListNode newHead …

尤雨溪推荐的拖拽插件,支持Vue2/Vue3 VueDraggablePlus

大家好,我是「前端实验室」爱分享的了不起~ 今天在网上看到尤雨溪推荐的这款拖拽组件,试了一下非常不错,这里推荐给大家。 说到拖拽工具库,非大名鼎鼎的的 Sortablejs 莫属。它是前端领域比较知名的,且功能强大的工具。但我们直接使用Sortablejs的情况很少,一般都是使用…

java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)

项目简介 智能无人仓库管理实现了以下功能&#xff1a; 基于Spring Boot智能无人仓库管理的主要使用者分为&#xff1a; 管理员的功能有&#xff1a;员工信息的查询管理&#xff0c;可以删除员工信息、修改员工信息、新增员工信息 &#x1f495;&#x1f495;作者&#xff1a…

容器镜像同步工具image-migrator

1 概述 image-migrator是一个用于容器镜像同步的可执行二进制命令行工具&#xff08;不依赖于docker命令&#xff09;&#xff0c;能够自动将基于Docker Registry v2镜像仓库&#xff08;registry、云厂商容器镜像服务、docker hub、Quay、Harbor &#xff09;中的镜像迁移到基…

MADE A PIE 之动态树形图

MADE A PIE api地址 他那个api里的代码可以直接拿过来用&#xff0c;只是他没有写怎么使用 使用时我发现如果节点太多会导致节点名称重叠&#xff0c;所以我在他这个基础之上加了一个放大缩小和随意拖动&#xff08;dragstart&#xff0c;dragend&#xff0c;flTop&#xff0…

收银员权限-收银系统源码

收银系统对于门店来说是收银员每天日常高频使用的软件工具&#xff0c;但很多门店老板不想给收银员开放很多权限&#xff0c;如商品改价、订单打折、会员充值、订单退款等都需要门店给其开通权限或者有权限码才能操作。 1. 收银员交接班 收银系统要支持交接班&#xff0c;收银…

OJ题——迷宫问题

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes &#x1f3c0;OJ题分享&#xff1a; Topic Sharing 前言&#xff1a; 在笔试或者竞赛的过程中&#xff0c;经…

剖析 MySQL 数据库连接池(C++版)

目录 ☀️0. 前言 &#x1f324;️1. 数据库连接池概述 ⛅1.1 服务器与数据库交互 ⛅1.2 MySQL 数据库网络模型 ⛅1.3 MySQL 连接驱动安装 ⛅1.4 同步&#xff08;synchronous&#xff09;连接池与异步&#xff08;asynchronous&#xff09;连接池 ⛅1.5 同步连接池和异…

Spring 循环依赖原理及解决方案

一、什么是循环依赖 循环依赖指的是一个实例或多个实例存在相互依赖的关系&#xff08;类之间循环嵌套引用&#xff09;。 举例&#xff1a; Component public class AService {// A中注入了BAutowiredprivate BService bService; }Component public class BService {// B中也…

通信工程学习:什么是PC永久连接、SPC软永久连接

一、PC永久连接 PC&#xff08;Permanent Connection&#xff09;永久连接是一种由网管系统通过网管协议建立的长期稳定的连接方式。在ASON&#xff08;自动交换光网络&#xff09;中&#xff0c;PC永久连接沿袭了传统光网络的连接建立形式&#xff0c;其特点主要包括&#xff…

【Canvas与密铺】正六边形、正方形和正三角形的密铺

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>正六边形正方形和正三角形的密铺1920x1080</title><style t…

SpringSecurity原理解析(四):SpringSecurity初始化过程

1、对 SpringSecurity初始化时的几个疑问 通过对前边一个请求流转的分析&#xff0c;我们知道一个请求要想到达服务端Servlet需要经过n多个 拦截器处理&#xff0c;请求处理流程如下所示&#xff1a; 对于一个请求到来后会通过FilterChainProxy来匹配一个对应的过滤器链来处理该…

PEST分析法包括哪些内容?用在线白板工具轻松绘制,简单好用!

在当今瞬息万变的商业环境中&#xff0c;企业需要一个全面而系统的方法来分析外部环境对其经营的影响。PEST分析模型恰好提供了这样一个强大的工具&#xff0c;帮助企业洞察政治、经济、社会和技术因素对其发展的潜在影响。 然而&#xff0c;如何高效地创建PEST分析模型一直是…