标准库中的string类(下)——“C++”
各位CSDN的uu们你们好呀,这段时间小雅兰的内容仍然是C++string类的使用的内容,下面,让我们进入string类的世界吧!!!
string类的常用接口说明
string - C++ Reference
string类的常用接口说明
string类对象的修改操作
insert




这是在第五个位置插入xxxx这个字符串!

下面的代码的意思是头插4个x字符!
头插还可以这么写,用迭代器的方式!
#include<iostream>
#include<string>
using namespace std;
int main()
{string s1("hello world");s1.insert(5, "xxxx");cout << s1 << endl;s1.insert(0, 4, 'x');cout << s1 << endl;s1.insert(s1.begin(), 'z');cout << s1 << endl;return 0;
}
insert最常见的用法还是插入字符和插入字符串!
严格来说,对于string类,insert是能少用就少用!
erase

下面两段代码的意思是:从第五个位置开始,删除四个字符
从第五个位置开始,后面有多少个字符就删多少个字符!
assign


#include<iostream>
#include<string>
using namespace std;
int main()
{string s1("hello world");s1.assign(s1);cout << s1 << endl;s1.assign(s1, 4, 7);cout << s1 << endl;s1.assign("pangrams are cool", 8);cout << s1 << endl;s1.assign("C-string");cout << s1 << endl;return 0;
}

replace


#include<iostream>
#include<string>
using namespace std;
int main()
{string s1("hello world hello lsy");cout << s1 << endl;//所有的空格替换成%20size_t pos = s1.find(' ');while (pos != string::npos){s1.replace(pos, 1, "%20");pos = s1.find(' ');}cout << s1 << endl;return 0;
}

以前在学习C语言的时候,就写过程序实现这个功能,只是那时候还颇为复杂,学习了C++的string类之后,就简单多了,但是,这个程序写得还是不够好!
真正的问题是:每次find都要从头开始find,这样显然是没有必要的!
这样写就好多了!
int main()
{
string s1("hello world hello lsy");
cout << s1 << endl;//所有的空格替换成%20
size_t pos = s1.find(' ', 0);
while (pos != string::npos)
{
s1.replace(pos, 1, "%20");
pos = s1.find(' ', pos + 3);
}
cout << s1 << endl;
return 0;
}

但是实际上,这个程序还是不会这样写,因为replace要挪动数据,效率是很低的!
下面,小雅兰就给大家介绍一种高效率的写法:
int main()
{string s1("hello world hello lsy");cout << s1 << endl;//所有的空格替换成%20size_t pos = s1.find(' ', 0);while (pos != string::npos){s1.replace(pos, 1, "%20");//效率很低,能不用就不要用了pos = s1.find(' ', pos + 3);}cout << s1 << endl;string s2("hello world hello lsy");cout << s2 << endl;string s3;for (auto ch : s2){if (ch == ' '){s3 += "%20";}else{s3 += ch;}}cout << s3 << endl;s2.swap(s3);cout << s2 << endl;return 0;
}

swap
不过,swap是不一样的!
第一个swap会产生临时对象,会有拷贝,效率没那么高,第二个swap就是直接交换了指针!
第二种写法的唯一缺陷就是消耗了空间!

pop_back

c_str

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;int main()
{
string filename("test20240124.cpp");
FILE* fout = fopen(filename.c_str(), "r");
char ch = fgetc(fout);
while (ch != EOF)
{
cout << ch;
ch = fgetc(fout);
}return 0;
}
这个接口的主要目的就是兼容C!
这个程序就把小雅兰今天在文件中写的代码全部读取到控制台啦!
find+substr


要取一个文件的后缀:
int main()
{string s1("Test.cpp");string s2("Test.zip");size_t pos1 = s1.find('.');if (pos1 != string::npos){string suff = s1.substr(pos1, s1.size() - pos1);//string suff = s1.substr(pos1);cout << suff << endl;}size_t pos2 = s2.find('.');if (pos2 != string::npos){string suff = s2.substr(pos2);cout << suff << endl;}return 0;
}

但是这样写有一点小问题:
int main()
{
string s1("Test.cpp");
string s2("Test.tar.zip");size_t pos1 = s1.find('.');
if (pos1 != string::npos)
{
//string suff = s1.substr(pos1, s1.size() - pos1);
string suff = s1.substr(pos1);
cout << suff << endl;
}size_t pos2 = s2.find('.');
if (pos2 != string::npos)
{
string suff = s2.substr(pos2);
cout << suff << endl;
}
return 0;
}
取到的不是真后缀!


int main()
{string s1("Test.cpp");string s2("Test.tar.zip");size_t pos1 = s1.rfind('.');if (pos1 != string::npos){//string suff = s1.substr(pos1, s1.size() - pos1);string suff = s1.substr(pos1);cout << suff << endl;}size_t pos2 = s2.rfind('.');if (pos2 != string::npos){string suff = s2.substr(pos2);cout << suff << endl;}return 0;
}

这样才是取到的正确的后缀!
接下来,来看一个更为复杂的场景:
给定一个网址,把它的三个部分分离!
string str("https://legacy.cplusplus.com/reference/string/string/substr/");
string sub1, sub2, sub3;
pos1 = str.find(':');
sub1 = str.substr(0, pos1 - 0);
cout << sub1 << endl;pos2 = str.find('/', pos1 + 3);
sub2 = str.substr(pos1 + 3, pos2 - (pos1 + 3));
cout << sub2 << endl;sub3 = str.substr(pos2 + 1);
cout << sub3 << endl;
find_first_of

#include<iostream>
#include<string>
using namespace std;int main()
{
std::string str("Please, replace the vowels in this sentence by asterisks.");
std::size_t found = str.find_first_of("aeiou");
while (found != std::string::npos)
{
str[found] = '*';
found = str.find_first_of("aeiou", found + 1);
}std::cout << str << '\n';
return 0;
}
find_last_of
#include<iostream>
#include<string>
using namespace std;void SplitFilename(const std::string& str)
{
std::cout << "Splitting: " << str << '\n';
std::size_t found = str.find_last_of("/\\");
std::cout << " path: " << str.substr(0, found) << '\n';
std::cout << " file: " << str.substr(found + 1) << '\n';
}int main()
{
std::string str1("/usr/bin/man");
std::string str2("c:\\windows\\winhelp.exe");SplitFilename(str1);
SplitFilename(str2);return 0;
}
![]()
find_first_not_of
#include<iostream>
#include<string>
using namespace std;int main()
{
std::string str("look for non-alphabetic characters...");std::size_t found = str.find_first_not_of("abcdefghijklmnopqrstuvwxyz ");
if (found != std::string::npos)
{
std::cout << "The first non-alphabetic character is " << str[found];
std::cout << " at position " << found << '\n';
}return 0;
}
![]()
find_last_not_of
#include<iostream>
#include<string>
using namespace std;int main()
{
std::string str("Please, erase trailing white-spaces \n");
std::string whitespaces(" \t\f\v\n\r");std::size_t found = str.find_last_not_of(whitespaces);
if (found != std::string::npos)
str.erase(found + 1);
else
str.clear(); // str is all whitespacestd::cout << '[' << str << "]\n";
return 0;
}
![]()
+
int main()
{string s1(" hello ");string s2("world");string ret1 = s1 + s2;cout << ret1 << endl;string ret2 = s1 + "xx";cout << ret2 << endl;string ret3 = "xx" + s1;cout << ret3 << endl;return 0;
}
字符串最后一个单词的长度

但是这个题目有一个坑,就是:不管是scanf还是cin,默认是用空格或者换行去分割!
#include <iostream>
using namespace std;
#include<string>
int main()
{string str;getline(cin,str);size_t pos=str.rfind(' ');if(pos!=string::npos){cout<<str.size()-(pos+1)<<endl;}else {cout<<str.size()<<endl;}return 0;
}
好啦,string的使用的部分到这里就结束啦,之前的文章:
https://xiaoyalan.blog.csdn.net/article/details/135110694?spm=1001.2014.3001.5502
https://xiaoyalan.blog.csdn.net/article/details/135133181?spm=1001.2014.3001.5502
还要继续加油!!!

相关文章:
标准库中的string类(下)——“C++”
各位CSDN的uu们你们好呀,这段时间小雅兰的内容仍然是Cstring类的使用的内容,下面,让我们进入string类的世界吧!!! string类的常用接口说明 string - C Reference string类的常用接口说明 string类对象的修…...
如何使用Docker部署火狐浏览器并实现无公网ip远程访问
文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…...
瑞_数据结构与算法_AVL树
文章目录 1 什么是AVL树1.1 AVL树的背景及定义1.2 判断失衡1.2.1 平衡因子1.2.2 失衡的四种情况1.2.2.1 LL1.2.2.2 LR1.2.2.3 RL1.2.2.4 RR 1.3 解决失衡1.3.1 左旋(RR)1.3.2 右旋(LL)1.3.3 先左旋再右旋(LR࿰…...
BGP同步规则
BGP同步规则:开启同步下,从IBGP收到一条路由不会传给任何EBGP邻居(实验效果IBGP邻居和EBGP邻居都不传),除非从自身的IGP中也学到这条路由。目的是防止AS内部出现路由黑洞,向外部通告了一个本AS不可达的虚假的路由。 同步规则只影响从IBGP邻居收到的路由,不影响从EBGP邻居收…...
Linux命令-apt-key命令(管理Debian Linux系统中的软件包密钥)
补充说明 apt-key命令 用于管理Debian Linux系统中的软件包密钥。每个发布的deb包,都是通过密钥认证 的,apt-key用来管理密钥。 语法 apt-key(参数)参数 操作指令:APT密钥操作指令。 实例 apt-key list # 列出已保存在系统中key。 apt-…...
Python根据Excel表进行文件重命名
一、问题背景 在日常办公过程中,批量重命名是经常使用的操作。之前我们已经进行了初步探索,主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。 而今天我们要使用的是PythonExcel的方法对指定目录下的文…...
【UVM源码】UVM Config_db机制使用总结与源码解析
UVM Config_db机制使用总结与源码解析 UVM Config_db机制介绍UVM Config_db 机制引入的背景基本介绍使用方法优缺点: UVM Config_db机制使用示例:UVM Config_db使用高阶规则Config_db资源优先级 UVM Config_db 源码解析 UVM Config_db机制介绍 UVM Conf…...
群辉开启WebDav服务+cpolar内网穿透实现移动端ES文件浏览器远程访问本地NAS文件
文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 本文主要介绍如何在群辉中开启WebDav服务,并结合cpolar内网穿透工具生成的公网地址,通过移动客户端ES文件浏览器即可实现移动设…...
通过mybatis拦截器给sql执行加一个耗时监控
代码没什么内容,直接贴上来吧,其中costTimeUtil可以看我的另一篇博文:java实现一个不带次数变量的加权平均值算法-CSDN博客 Slf4j Intercepts({Signature(type StatementHandler.class,method "query",args {Statement.class, …...
构建知识图谱:从技术到实战的完整指南
目录 一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图数据库选择Neo4jArangoDB 构建流程数据预处理实体关系识别图…...
STM32的分类和选型
F系列(主要用于普通应用) STM32F0xx:低成本、低功耗,适用于成本敏感和低功耗的应用。STM32F1xx:中低端微控制器,具有丰富的外设和良好的性能。STM32F2xx:高性能微控制器,适用于要求…...
python使用read_sql与to_sql读写数据库
文章目录 详细说明示例程序 详细说明 使用pandas读写数据库的方法(以Mysql为例)如下: 首先是打包一个工具函数: import pandas as pd import numpy as np from sqlalchemy import create_engine, textdef get_sql_engine():# 数据…...
【ArcGIS微课1000例】0096:dem三维块状表达(层次地形模型)
文章目录 一、DEM表达方式二、层次模型表达三、注意事项一、DEM表达方式 DEM数字高程模型的表达方式通常有以下4种: 1. 规则格网 2. 不规则三角网 3. 等高线 4. 层次地形模型 作为栅格地理数据,DEM 数据具有2.5维的特征,能够以三维表面的形式进行三维空间表达。但受其数…...
OJ_糖果分享游戏
题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;void ShareCandy(vector<int>& student) {int size student.size();vector<int> share(size); //保存每个同学交换前,糖果数量…...
sqli-lbs靶场搭建
目录 环境小皮源码下载 1.源码解压: 2.搭建网站 2.1点击创建网站 2.2修改sql-connections\db-creds.inc 2.3重新启动 3.访问你设置的域名 3.1点击启动数据库配置 3.2返回第一个页面(开启题目) sqlilbs靶场搭建 环境小皮源码下载 下载地址&am…...
SharedPreferences卡顿分析
SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式,是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里,SP的使用示例及源码解析参见:Android本地存储之SharedPreferences源码解析。以…...
64、ubuntu使用c++/python调用alliedvisio工业相机
基本思想:需要使用linux系统调用alliedvisio工业相机完成业务,这里只做驱动相机调用,具体不涉及业务开发 Alvium 相机选型 - Allied Vision 一、先用软件调用一下用于机器视觉和嵌入式视觉的Vimba X 软件开发包 - Allied Vision VimbaX_Set…...
网络端口与 IP 地址有什么区别?
网络端口和IP地址是计算机网络中两个非常重要的概念,它们在实现网络通信和数据传输中扮演着不同的角色。 IP地址 IP地址(Internet Protocol Address)是用于标识网络上设备的唯一地址。它是一个由数字组成的标识符,用于在网络中准…...
C语言标准的输入输出
目录 1. 格式化输入输出 2. 控制字符串长度 3. 混合格式化输出 4. 格式化浮点数 5. 格式化日期和时间 在C语言编程中,输入输出格式非常重要,它决定了程序如何向用户展示数据以及如何从用户接收数据。本篇博客将介绍C语言输入输出格式的一些基本概念…...
C++ 类与对象(上)
目录 本节目标 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6. 类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 8.this指针 8.1 thi…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...

