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

标准库中的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 whitespace

    std::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们你们好呀&#xff0c;这段时间小雅兰的内容仍然是Cstring类的使用的内容&#xff0c;下面&#xff0c;让我们进入string类的世界吧&#xff01;&#xff01;&#xff01; string类的常用接口说明 string - C Reference string类的常用接口说明 string类对象的修…...

如何使用Docker部署火狐浏览器并实现无公网ip远程访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由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 左旋&#xff08;RR&#xff09;1.3.2 右旋&#xff08;LL&#xff09;1.3.3 先左旋再右旋&#xff08;LR&#xff0…...

BGP同步规则

BGP同步规则:开启同步下,从IBGP收到一条路由不会传给任何EBGP邻居(实验效果IBGP邻居和EBGP邻居都不传),除非从自身的IGP中也学到这条路由。目的是防止AS内部出现路由黑洞,向外部通告了一个本AS不可达的虚假的路由。 同步规则只影响从IBGP邻居收到的路由,不影响从EBGP邻居收…...

Linux命令-apt-key命令(管理Debian Linux系统中的软件包密钥)

补充说明 apt-key命令 用于管理Debian Linux系统中的软件包密钥。每个发布的deb包&#xff0c;都是通过密钥认证 的&#xff0c;apt-key用来管理密钥。 语法 apt-key(参数)参数 操作指令&#xff1a;APT密钥操作指令。 实例 apt-key list # 列出已保存在系统中key。 apt-…...

Python根据Excel表进行文件重命名

一、问题背景 在日常办公过程中&#xff0c;批量重命名是经常使用的操作。之前我们已经进行了初步探索&#xff0c;主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。 而今天我们要使用的是PythonExcel的方法对指定目录下的文…...

【UVM源码】UVM Config_db机制使用总结与源码解析

UVM Config_db机制使用总结与源码解析 UVM Config_db机制介绍UVM Config_db 机制引入的背景基本介绍使用方法优缺点&#xff1a; UVM Config_db机制使用示例&#xff1a;UVM Config_db使用高阶规则Config_db资源优先级 UVM Config_db 源码解析 UVM Config_db机制介绍 UVM Conf…...

群辉开启WebDav服务+cpolar内网穿透实现移动端ES文件浏览器远程访问本地NAS文件

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 本文主要介绍如何在群辉中开启WebDav服务&#xff0c;并结合cpolar内网穿透工具生成的公网地址&#xff0c;通过移动客户端ES文件浏览器即可实现移动设…...

通过mybatis拦截器给sql执行加一个耗时监控

代码没什么内容&#xff0c;直接贴上来吧&#xff0c;其中costTimeUtil可以看我的另一篇博文&#xff1a;java实现一个不带次数变量的加权平均值算法-CSDN博客 Slf4j Intercepts({Signature(type StatementHandler.class,method "query",args {Statement.class, …...

构建知识图谱:从技术到实战的完整指南

目录 一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图数据库选择Neo4jArangoDB 构建流程数据预处理实体关系识别图…...

STM32的分类和选型

F系列&#xff08;主要用于普通应用&#xff09; STM32F0xx&#xff1a;低成本、低功耗&#xff0c;适用于成本敏感和低功耗的应用。STM32F1xx&#xff1a;中低端微控制器&#xff0c;具有丰富的外设和良好的性能。STM32F2xx&#xff1a;高性能微控制器&#xff0c;适用于要求…...

python使用read_sql与to_sql读写数据库

文章目录 详细说明示例程序 详细说明 使用pandas读写数据库的方法&#xff08;以Mysql为例&#xff09;如下&#xff1a; 首先是打包一个工具函数&#xff1a; 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); //保存每个同学交换前&#xff0c;糖果数量…...

sqli-lbs靶场搭建

目录 环境小皮源码下载 1.源码解压&#xff1a; 2.搭建网站 2.1点击创建网站 2.2修改sql-connections\db-creds.inc 2.3重新启动 3.访问你设置的域名 3.1点击启动数据库配置 3.2返回第一个页面&#xff08;开启题目&#xff09; sqlilbs靶场搭建 环境小皮源码下载 下载地址&am…...

SharedPreferences卡顿分析

SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式&#xff0c;是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里&#xff0c;SP的使用示例及源码解析参见&#xff1a;Android本地存储之SharedPreferences源码解析。以…...

64、ubuntu使用c++/python调用alliedvisio工业相机

基本思想&#xff1a;需要使用linux系统调用alliedvisio工业相机完成业务&#xff0c;这里只做驱动相机调用&#xff0c;具体不涉及业务开发 Alvium 相机选型 - Allied Vision 一、先用软件调用一下用于机器视觉和嵌入式视觉的Vimba X 软件开发包 - Allied Vision VimbaX_Set…...

网络端口与 IP 地址有什么区别?

网络端口和IP地址是计算机网络中两个非常重要的概念&#xff0c;它们在实现网络通信和数据传输中扮演着不同的角色。 IP地址 IP地址&#xff08;Internet Protocol Address&#xff09;是用于标识网络上设备的唯一地址。它是一个由数字组成的标识符&#xff0c;用于在网络中准…...

C语言标准的输入输出

目录 1. 格式化输入输出 2. 控制字符串长度 3. 混合格式化输出 4. 格式化浮点数 5. 格式化日期和时间 在C语言编程中&#xff0c;输入输出格式非常重要&#xff0c;它决定了程序如何向用户展示数据以及如何从用户接收数据。本篇博客将介绍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 Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...