当前位置: 首页 > news >正文

猿创征文——C++|string类2

 

目录

 assagin|erase|insert

 c_str()

find 

用find和substr实现网址的分离 

operator (了解内容)

getline 

 convert

习题 字符串中的第一个唯一字符 

习题 验证一个字符串是否回文 


 assagin|erase|insert

assign相当于赋值语句 

 

 insert插入,可插入某个string对象,字符串,字符,在某位置前插入

若想在空格处插入%20,下面这种写法会出问题

 

当遇到空格之后,insert会把%20插入到空格前面,然后把其余字符串往后挪, 

而插入之后,i还在原来位置,往后遍历又会遇到空格,所以程序会陷入死循环 

修改每次i插入后的位置,程序正常运行

 若想吧空格替换为%20

erase是用来删除的 

string& erase(size_t pos=0,size_t lend=npos)

从0这个位置开始删除len个字符

如果len>剩余字符串长度,则有多少删除多少,删到结尾

 用insert和erase效率太低,我们采用空间换时间的方法来优化

时间复杂度比之前低一点,但是空间复杂度变高

 

刚才的写法,还可用replace替代,replace是用来替换的,但是效率不高,也要挪动数据,

insert,erase,replace不推荐使用,效率低

 c_str()

c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同。
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

 

返回const char * 类型 

 用C语言的方式打开文件,此时报错

 加上c_str即可正常运行

 读取当前文件

 比较这俩种写法

效果一样 ,但是实际不一样,底层原理不一样

 C++中是以string对象size为准,size为多少就输出多少个

而C语言是以常量字符串遇到\0结束

find 

 

 find可查找一个字符,字符串,string对象,pos指从某个位置开始查,n代表要匹配的字符序列的长度。

返回值是无符号类型,如果找到了返回找到的第一个字符的位置,如果没找到返回string::npos,npos是一个特别大的数字

 

 有时还会用到substr

 取当前string的字符串返回一个新对象,从pos位置,取len个字符,规则跟前面取字符一样

用find和substr查找文件的后缀名

 有的文件后缀比较复杂:如.exe.zip

当我们想取最后一个后缀的时候,可用rfind

搜索由其参数指定的序列的最后一次出现。 

把find替换为rfind之后,直接找到最后一个.

用find和substr实现网址的分离 

void test_string5()
{
	string ur1 = "https://cplusplus.com/reference/string/string/rfind/";
	size_t pos = ur1.find("://");
	string ur2 = ur1.substr(0, pos-1);
	cout << ur2 << endl;
	size_t pos1 = ur1.find('/', pos + 3);
	string ur3 = ur1.substr(pos + 3, pos1 - pos-3);
	cout << ur3 << endl;
	string ur4 = ur1.substr(pos1+1);
	cout << ur4 << endl;
}
int main()
{
	test_string5();
	return 0;
}

 

  find_first_of:在字符串中搜索与其参数中指定的任何字符相匹配的第一个字符,指定pos位置时,从pos位置开始搜索,匹配一个字符就够了(不是全部匹配)

operator (了解内容)

string还有+比较大小等功能

 

getline 

不管是cin还是scanf,遇到空格或者换行会进行间会把hello传输给a,空格和c保留在缓冲区

 

 C++ string中有getline可以解决上面的问题

 从 is 中提取字符并将其存储到 str 中,直到找到分隔字符 delim(或换行符“\n”,表示 (2))

如果到达文件的末尾或者在输入操作期间发生其他错误,则提取也会停止。

如果找到分隔符,则将其提取并丢弃(即不存储它,下一个输入操作将在它之后开始)。

请注意,调用之前的任何内容都将替换为新提取的序列。

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)

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

int main(){
      string str;
    getline(cin,str);
    size_t pos=str.rfind(' ');
    if(pos!=string::npos)
    {
        cout<<str.size()-1-pos<<endl;
    }
    else
    {
        cout<<str.size()<<endl;
    }
}

 convert

C++中convert使用率比较高

 atoi可把字符串转整形

 itoa整形转字符串

to_string将数字常量转换为字符串,返回值为转换完毕的字符串,返回类型为string

 也能转回去

 

习题 字符串中的第一个唯一字符 

387. 字符串中的第一个唯一字符 - 力扣(LeetCode) 

class Solution {
public:
    int firstUniqChar(string s) {
int arr[26]={0};
for(auto ch:s)
{
    arr[ch-'a']++;
}
for(int i=0;i<s.size();i++)
{
    if(arr[s[i]-'a']==1)
    return i;
}
return -1;
    }
};

 思路:创建一个容量为26的整形数组,数组第一个元素到第一个元素分别用来统计a到z出现的次数,

习题 验证一个字符串是否回文 

125. 验证回文串 - 力扣(LeetCode)

class Solution {
public:
bool IslettersorNumb(char str)
{
if((str>='0'&&str<='9')||(str>='a'&&str<='z'))
return true;
else
return false;
}
    bool isPalindrome(string s) {
        for(auto& ch:s)
        {
            if(ch>='A'&&ch<='Z')
            ch+=32;
        }
        int begin=0,end=s.size()-1;
        while(begin<end)
        {
            while(begin<end&&!IslettersorNumb(s[begin]))
            begin++;
            while(begin<end&&!IslettersorNumb(s[end]))
            end--;
            if(s[begin]!=s[end])
            return false;
            else
            begin++;
            end--;
        }
        return true;
    }
};

相关文章:

  • 【51单片机】认识单片机
  • Windows中执行C语言编译的程序乱码的解决方法
  • 商城项目10_JSR303常用注解、在项目中如何使用、统一处理异常、分组校验功能、自定义校验注解
  • 一天时间迅速准备前端面试|JS基础—原型和原型链【三座大山之一,必考】
  • Spring Security详细讲解(JWT+SpringSecurity登入案例)
  • 【Network】网络基础@应用层 —— 协议 | http | https
  • UGUI学习笔记(九)自制3D轮播图
  • R统计-单因素ANOVA/Kruskal-Wallis置换检验
  • 动态开点线段树(C++实现)
  • pytorch保存和加载模型权重以及CUDA在pytorch中的使用
  • UDF提权(mysql)
  • linux内核漏洞(CVE-2022-0847)
  • kubekey 离线部署 kubesphere v3.3.0
  • Git史上最详细教程(详细图解)
  • Python科学计算库练习题
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Docker 笔记(2):Dockerfile
  • extjs4学习之配置
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Meteor的表单提交:Form
  • Ruby 2.x 源代码分析:扩展 概述
  • session共享问题解决方案
  • Spring声明式事务管理之一:五大属性分析
  • 从零搭建Koa2 Server
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 看域名解析域名安全对SEO的影响
  • 前嗅ForeSpider教程:创建模板
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用Gradle第一次构建Java程序
  • 提醒我喝水chrome插件开发指南
  • 因为阿里,他们成了“杭漂”
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • (k8s中)docker netty OOM问题记录
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (篇九)MySQL常用内置函数
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 设计一套高性能的弱事件机制
  • .NET的微型Web框架 Nancy
  • .NET面试题(二)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • @Autowired多个相同类型bean装配问题
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @font-face 用字体画图标
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ C++ ] STL_list 使用及其模拟实现
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [C/C++] C/C++中数字与字符串之间的转换
  • [c]扫雷