String类 [上]

news2024/9/29 18:41:14

 

一、编码的基础介绍

编码:是信息从一种形式或格式转换为另一种形式的过程。

ASCLL 编码表:主要表示的是英文的编码表

Unicode:是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码二进制编码二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求

GBK:可以说是为中文量身定做的一种编码

 二、String 类的介绍

在C 语言中,字符串是以 '\0' 结尾的一些字符的集合,为了操作方便, C 标准库中提供了一些 str 系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP(即面向对象程序设计 )的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。

而在C++中的string是表示字符串的字符串类,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;并且不能操作多字节或者变长字符的序列。String类可以管理字符串,大大减少了人工管理所存在的问题。

但需要注意的是:使用string类时,必须包含#include头文件以及using namespace std;

三、string类的常用接口

3.1 构造函数

 String类的构造函数有7个,主要是以下三个,分别是默认构造,拷贝构造以及带参的构造

“首先cin的输入有一个特点,在遇到‘ ’(空格)或换行时,会结束输入,因为cin以空格和换行为间隔,区分前后的输入,而cin.get()则将‘ ’也作为了一个字符放到输入里。”

然而上面的三个构造函数是非常重要的,需要着重掌握,其次我们也可以了解一下

 这个构造函数的作用是用str对象从第pos个位置开始npos个长度去构造新的对象

其中npos为缺省值,默认为-1,又因为是size_t类型,所以是整形的最大值,即表示如果你没有给长度的时候,会使用这个缺省值,又因为size_t类型,所以从第pos位置开始有多少拷贝多少

 npos是静态成员变量也是size_t类型,即表示整形的最大值

 

 作用:拷贝s的前三个字符

需要与上面

区别的是:一个是const char* 指针,一个是const string& str对象

 

作用:用n个c字符去初始化

3.2 析构函数

 系统会自动调用析构函数

3.3  string 的容量操作

size 用于返回字符串有效字符长度,不包含'\0',作为下标是最后一个数据的下一个位置

length  用于返回字符串有效字符长度,不包含'\0'

 max_size 返回字符串最大长度

 capacity 返回空间的分配大小

 clear 清理空间数据

 empty 检测字符串释放为空串,是返回true,否则返回false

 3.4 string类对象的访问及遍历操作

遍历string方式一  :  char&返回不是为了减少拷贝,是为了支持修改返回对象,返回的是pos位置的字符的引用,

即可以对pos位置的值进行修改

遍历string 方式2 :迭代器 可以把it理解成指针

 

 方式3:范围for:每次自动识别每个字符赋值给e,自动往后迭代,自动判断结束

可读可写:

 迭代器:

对于string,[ ]+下标的方式已经很好来访问和修改了,为什么还要用正向迭代器和反向迭代器呢?

对于string,下标和[ ]是足够好用,可以不同迭代器,但是对于其他的容器呢?

所以使用迭代器的原因是所有的容器都可以用迭代器去访问和修改。

 除了3.4第二种方式里面使用的正向迭代器外还有反向迭代器

带有const 的正向和反向迭代器

 at 与operator[]的作用差不多,但是他们的区别在于当发生错误的时候,at是进行抛异常,operator[]是进行断言

 back : 用于返回字符串尾上的字符

 front:用于返回字符串头上的字符

3.5 string类对象的修改操作

push_back   在字符串后尾插字符 c
append    在字符串后追加一个字符串

operator+= ( 重点 ) 在字符串后追加字符串 str(可以直接适用上面俩个情况,推荐)

 牛刀小试:

力扣https://leetcode.cn/problems/reverse-only-letters/

思路:与快排相似,设置头和尾的俩个下标,头和尾下标都是字母则进行交换,如果有一个不是则再while循环中进行寻找,直到是字母,然后再进行交换,然后继续迭代

运行今日学习的方方:比如string类中的swap模板,size等等

class Solution {
public:
    string reverseOnlyLetters(string s) 
    {
        int begin = 0;
        int end = s.size()-1;
        while(begin < end)
        {
            //如果不是字母就跳过,都是字母就交换,如果一直都不是字母呢?不就一直++了吗,所以也要进行begin<end判断
            while(begin < end && !isalpha(s[begin]))
            {
                begin++;//直到找到是字母,然后交换
            }
            while(begin < end && !isalpha(s[end]))
            {
                end--;
            }
            //交换
            swap(s[begin],s[end]);
            //交换之后继续迭代
            ++begin;
            --end;
        }
         return s;
    }
};

力扣https://leetcode.cn/problems/first-unique-character-in-a-string/submissions/

思路:相当于计数排序,用数组的方式,时间复杂度为o(n)

因为只有26个小写字母,可以设置大小为26的整形数组(因为里面存放的是每个字母出现的次数),对字符串中的字母进行统计,从'a'为0下标开始,依次将每个字母出现的次数放在对应的下标下,然后再对字符串进行遍历即对应带对应的数组里面的次数,出现第一次次数为1的即为不重复的字母,返回它的下标,否则返回-1

class Solution {
public:
    int firstUniqChar(string s) 
    {
        //用数组的方式,相似与计数排序
        int array[26] = {0};//因为只有小写字母
       for(int  i = 0; i < s.size();i++)
       {
           array[s[i] - 'a']++;//从a为0下标开始,依次对应的字母次数放在对应的下标下
       }
       for( int j= 0; j< s.size();j++)
       {
           if(array[s[j] - 'a'] == 1)//s[j]-'a'是按照字符串中的顺序,先出现1的就是不重复的
           {
               return j;
           }
       }
       return -1;

    }
};

 利用reserve(直接开好空间)提高插入数据的效率,避免增容带来的开销

 reserve和resize的区别

 reverse和resize,如果string s1("hello world");s1有元素,那么都相当于扩容

resize如果申请的个数比s1里面的数少,那么会多余的数会删除

c_str:返回C格式字符串

查找:

find:   size_type find (charT c, size_type pos = 0) const;

查找什么字符,从pos开始找,默认pos下标为0,从左往右找第一次出现的

如果想找最后一次出现的后缀,则可以从右往左找,rfind

size_type rfind (charT c, size_type pos = npos) const;

 取url中的各个段

插入

删除

 

 牛刀小试:

字符串最后一个单词的长度_牛客题霸_牛客网

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s1;
    //因为cin遇到空格和换行结束,所以获取整个字符串的方式一:
    char ch = cin.get();//每次获取一个字符
    while(ch != '\n')//整个字符串以换行结束
    {
        s1 += ch;
        ch = cin.get();
    }
    
    //方式二:
    getline(cin,s1);//cin的字符串放到s1中去
    size_t pos = s1.rfind(' ');//从后往前找,最后一个单词

    if(pos == string::npos)
    {
        cout << s1.size()<< endl;
    }
    else
    {
        size_t length = s1.size() - (pos+1);
        cout << length << endl;
    }
    
    return 0;
}

string的比较重载函数:

 

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

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

相关文章

小白式linux系统怎么安装宝塔面板

有很多小白同学问我linux系统服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程&#xff0c;让不懂的新手小白一看就会&#xff0c;分分钟上手教程怎么安装宝塔面板&#xff1f;这个其实很简单接下来跟着我操作。以linux centos7.6 举例Centos安…

[计算机操作系统(慕课版)]第二章 进程的描述与控制(学习笔记)

2.1 前驱图和程序执行 2.1.1 前驱图 前驱图是指一个有向无循环图可记为DAG前驱图用于描述进程之间执行的先后顺序。前驱图的每个节点用来表示一个进程或程序段乃至一条语句节点间的有向边表示两个节点之间存在的偏序或前驱关系。进程或程序之间的前驱关系可用→来表示。如果进…

有了这些接口测试用例+工具,测试效率想不提升都难

写在前面&#xff1a;在日常开发过程中&#xff0c;有人做前端开发&#xff0c;有人负责后端开发。接口的主要作用就是连接前后台。但是&#xff0c;由于前端和后端开发的速度可能不一样&#xff0c;尤其是后端开发好了&#xff0c;但前端还未开发。这种时候我们需要做接口测试…

【原创】java+swing+mysql银行ATM管理系统

本文主要介绍使用javaswingmysql去设计一个银行ATM管理系统&#xff0c;模仿实现存款、取款、转账、余额查询等功能。 功能分析&#xff1a; 隐含ATM管理系统一般分为管理员和用户角色&#xff0c;管理员可以进行用户管理、账单管理&#xff0c;用户可以进行转取存款等功能如…

面试不到10分钟就被赶出来了,问的实在是太变态了...

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…

深度学习网络模型——ConvNeXt网络详解、ConvNeXt网络训练花分类数据集整体项目实现

深度学习网络模型——ConvNeXt网络详解、ConvNeXt网络训练花分类数据集整体项目实现1、介绍2、设计方案3、Macro design4、ResNeXt-ify5、Inverted Bottleneck7、Large Kernel Sizes8、Micro Design9、ConvNeXt variants10、ConvNeXt-T 结构图11、网络代码实现&#xff1a;Conv…

内网渗透(三十五)之横向移动篇-IPC配合系统服务横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Linux文件权限查看与修改

Linux文件的权限linu文件的权限可以分为四类&#xff1a;可读、可写、可执行、没有权限。分别用字符r、w、x、- 表示。2. 用户与用户组Liunx是一个多用户多任务的操作系统&#xff0c;可以通过用户和用户组来更好的控制文件的权限。每个文件都有一个拥有者&#xff08;某一个具…

批处理Batch学习

批处理Batch学习 前几天一个月薪35k的兄弟&#xff0c;给我推了一个人工智能学习网站&#xff0c;看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有&#xff0c;很详细&#xff0c;分享给大家。大家及时保存&#xff0c;说不定啥时候就没了。 基础认识 批…

Linux下Python脚本的编写解析fio(minimal格式)(三)

在服务器测试(storage)过程中&#xff0c;会看到很多人写跑fio的脚本用minimal格式来解析&#xff0c;因为这种格式返回的结果对与脚本(shell,python)解析log非常方便.下面介绍一下这种方式下,用Python来解析log 1 一般客户会要求结果中出现一下参数的值&#xff1a; bandwidth…

推荐几款免费且优秀的短视频配音软件,你值得拥有

科技的迅猛发展带来了新生事物的不断涌现&#xff0c;短视频就是其中之一&#xff0c;有的小伙伴喜欢在茶余饭后记录生活的点点滴滴&#xff0c;也有人将之变成了日常的主要收入来源&#xff0c;但无论是哪种&#xff0c;一款好的AI配音软件都是必不可少的&#xff0c;很多短视…

LeetCode 88. 合并两个有序数组

原题链接 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1nums1nums1 和 nums2nums2nums2&#xff0c;另有两个整数 mmm 和 nnn &#xff0c;分别表示 nums1nums1nums1 和 nums2nums2nums2 中的元素数目。 请你 合并 num…

Flask像Jenkins一样构建自动化测试任务

flask这个框架很轻量&#xff0c;做一些小工具还是可以很快上手的。 1、自动化 某一天你入职了一家高大上的科技公司&#xff0c;开心的做着软件测试的工作&#xff0c;每天点点点&#xff0c;下班就走&#xff0c;晚上陪女朋友玩王者&#xff0c;生活很惬意。 但是美好时光…

常用类(四)Math类和Arrays类

一、Math类 Math类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数 我们查看math类的常用方法&#xff1a; 我们查看他的源码如下所示&#xff1a; 我们查看他的类图&#xff1a; 他的这些方法基本都是静态的&#xff1a; 我们的代码设置如下所…

重生之我是赏金猎人-SRC漏洞挖掘(十三)-攻防对抗/梦中绝杀X脖代理商

0x00 前言 前两天在国企实验室的朋友遇到了一个棘手的目标&#xff0c;听说之前没人能打点进去&#xff0c;只能靠xxxxx取证 我一听来了兴趣&#xff0c;在梦中臆造了一个靶场进行渗透&#xff0c;并且已获得相关授权 还请各位看官请勿对号入座&#xff0c;如有雷同&#xf…

百舸争流,奋楫者先 | 大势智慧2023年度销售动员大会圆满召开

春回大地&#xff0c;万物新生。满载生机与动力&#xff0c;2月10日&#xff0c;大势智慧2023年度销售动员大会圆满召开。 大势智慧CEO黄先锋、CTO张帆、副总裁周济安、运营中心副总经理段鸿、全国各分公司总经理、总监及全体销售成员线上、线下共聚一堂&#xff0c;以“百舸争…

Android Jetpack组件DataStore之Proto与Preferences存储详解与使用

一、介绍 Jetpack DataStore 是一种数据存储解决方案&#xff0c;允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。 如果您当前在使用 SharedPreferences 存储数据&#xff0c;请考虑迁移到 DataStore&#…

vscode构建Vue3.0项目(vite,vue-cli)

构建Vue3.0项目构建Vue3.0项目1.使用Vite构建vue项目的方法以及步骤1. 安装vite2. 运行vite vue 项目3.说明2.使用vue-cli构建vue项目的方法以及步骤1.安装全局vue cli —— 脚手架2、VSCode3.报错4.运行构建Vue3.0项目 1.使用Vite构建vue项目的方法以及步骤 1. 安装vite n…

这才是计算机科学_计算机安全

文章目录一、前言1.1身份认证authentication1.2 权限1.3 开发安全二、黑客2.1 NAND镜像2.2 缓冲区溢出2.3 注入三、加密 cryptography3.1 列位移加密3.2 软件加密3.3 密钥交换一、前言 计算机网络中并不是没有人搞破坏的 但是网络无法区分中要执行的是好是坏 计算机安全&#…

设计模式第七讲-外观模式、适配器模式、模板方法模式详解

一. 外观模式 1. 背景 在现实生活中&#xff0c;常常存在办事较复杂的例子&#xff0c;如办房产证或注册一家公司&#xff0c;有时要同多个部门联系&#xff0c;这时要是有一个综合部门能解决一切手续问题就好了。 软件设计也是这样&#xff0c;当一个系统的功能越来越强&…