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

C++——string使用

string的常见构造接口 

string()

构造空的srting类对象,空字符串

string(const char* str)

用字符串初始化

string(const string& str)拷贝构造,使用string类初始化
string(size_t n, char c) 用n个字符c初始化
string s1; 
string s2("hello world");
string s3(s2); 
string s4(10,'*');

string类对象的容量操作

size返回字符串有效长度
capacity返回总空间大小
empty判断对象是否为空
clear清空有效字符
reserve为字符串预留空间
resize修改有效字符个数

size——返回字符串的有效长度

std::string::size
size_t size() const;
int main ()
{std::string str ("Test string");std::cout << "The size of str is " << str.size() << " bytes.\n";return 0;
}
//The size of str is 11 bytes

 capacity——返回空间总大小

std::string::capacity
size_t capacity() const;
int main ()
{std::string str ("Test string");std::cout << "size: " << str.size() << "\n";std::cout << "capacity: " << str.capacity() << "\n";return 0;
}//size: 11
//capacity: 15

 empty——判断对象是否为空

std::string::empty
bool empty() const;

应用:将用户输入的内容逐行读取并存储,直到遇到空行 

#include<iostream>
#include<string>
using namespace std;
int main()
{string line;string content;do{getline(cin, line);content += line + '\n';} while (!line.empty());cout << content;
}

clear——清空有效字符

std::string::clear
void clear();
#include<iostream>
#include<string>
using namespace std;
int main()
{string str("hello world");str.clear();if (str.empty())cout << "string has been deleted" << endl;
}

clear只改清空数据,不改变空间大小 

reserve——为字符串预留空间

std::string::reserve
void reserve (size_t n = 0);
int main()
{string str("hello world");cout << str.capacity() << endl;cout << str.size() << endl;str.reserve(100);cout << str.capacity() << endl;cout << str.size() << endl;
}

 当参数n小于字符串大小时,不会缩小容量

resize——修改有效字符个数

std::string::resize
void resize (size_t n);void resize (size_t n, char c);

当n大于字符串大小时,多的空间会用字符c来填充(\0不会被覆盖) ,如果c缺省会自动补\0;如果n小于字符串大小时,会将多出的字符直接删除,但是不会改变基层空间capacity

int main()
{string str;str.resize(1);cout << str << endl;str.resize(5, '+');cout << str << endl;//字符串是 \0++++ 不同编译器输出可能不同str.resize(1);cout << str << endl;
}

string类对象的访问及遍历

operator[ ]下标方式访问,类似数组
begin,end迭代器顺序遍历
rbegin,rend迭代器逆序遍历
范围for底层还是迭代器
c_str返回c格式字符串

operator[ ]——[ ]的运算符重载

std::string::operator[]
char& operator[] (size_t pos);const char& operator[] (size_t pos) const;

使用和数组类似,都是访问[ ]内数字下标位置的字符

int main()
{string str("hello world");for (int i = 0; i < str.size(); i++){cout << str[i];}cout << endl;
}

迭代器begin和end,顺序遍历

iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
using namespace std;int main()
{string str("hello world");string::iterator sit = str.begin();while (sit != str.end()){cout << *sit;sit++;}cout << endl;
}

迭代器rbegin和rend,逆序遍历

reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
using namespace std;int main()
{const string str("hello world");string::const_reverse_iterator sit = str.rbegin();while (sit != str.rend()){cout << *sit;sit++;}cout << endl;
}

范围for(底层使用迭代器)

int main()
{const string str("hello world");for (char c : str){cout << c;}cout << endl;
}

c_str——返回c格式字符串

std::string::c_strconst char* c_str() const;
int main()
{string str("hello world");const char* ch = str.c_str();cout << ch << endl;
}

 这个接口是为了和c语言更好兼容


string类对象的修改

append追加字符串
operator+=

追加字符串

find从前寻找字符(串)并返回下标位置
rfind从后寻找字符(串)并返回下标位置
substr从字符串中截取子串

append——追加字符串

std::string::append//追加str
string& append (const string& str);//追加str的子串,字串是从str的subpos下标位置开始,向后的sublen个字符
string& append (const string& str, size_t subpos, size_t sublen);//追加常量字符串s
string& append (const char* s);//追加常量字符串的前n个字符
string& append (const char* s, size_t n);//追加n个字符c
string& append (size_t n, char c);//迭代器追加
template <class InputIterator>   string& append (InputIterator first, InputIterator last);
#include <iostream>
#include <string>int main ()
{std::string str;std::string str2="Writing ";std::string str3="print 10 and then 5 more";// used in the same order as described above:str.append(str2);                       // "Writing "str.append(str3,6,3);                   // "10 "str.append("dots are cool",5);          // "dots "str.append("here: ");                   // "here: "str.append(10,'.');                    // ".........."str.append(str3.begin()+8,str3.end());  // " and then 5 more"str.append(5,'.');                // "....."std::cout << str << '\n';return 0;
}
//Writing 10 dots here: .......... and then 5 more.....

operator+= ——追加字符串

std::string::operator+=string& operator+= (const string& str);string& operator+= (const char* s);string& operator+= (char c);

+=运算符重载和append的功能基本相同,append除此之外可以使用迭代器,插入指定数量的字符,但是+=使用更方便

find——从前寻找字符(串)并返回下标位置

std::string::findsize_t find (const string& str, size_t pos = 0) const;	
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;

rfind——从后寻找字符(串)并返回下标位置

string::npos是一个静态无符号整型变量,大小为-1(即最大的无符号整数)

std::string::rfindsize_t rfind (const string& str, size_t pos = npos) const;	
size_t rfind (const char* s, size_t pos = npos) const;
size_t rfind (const char* s, size_t pos, size_t n) const;	
size_t rfind (char c, size_t pos = npos) const;

rfind如果未给出查找的起始位置,或者起始位置下标越界,会从字符串末尾开始寻找;rfind和find一样,如果未找到目标,就会返回npos

substr——从字符串中截取子串

std::string::substr
string substr (size_t pos = 0, size_t len = npos) const;

如果pos等于字符串大小,就会返回空字符串;如果pos大于字符串大小,就会抛异常

#include <iostream>
#include <string>int main ()
{std::string str="We think in generalities, but we live in details.";std::string str2 = str.substr (3,5);     // "think"std::size_t pos = str.find("live");      // position of "live" in strstd::string str3 = str.substr (pos);     // get from "live" to the endstd::cout << str2 << ' ' << str3 << '\n';return 0;
}

string类的非成员函数

operator+效率低,少用
operator+=追加字符(串)
operator>>,operator<<输入输出运算符重载

getline

获取一行字符串
relational operators大小比较

operator+

std::operator+ (string)string operator+ (const string& lhs, const string& rhs);	string operator+ (const string& lhs, const char*   rhs);
string operator+ (const char*   lhs, const string& rhs);string operator+ (const string& lhs, char          rhs);
string operator+ (char          lhs, const string& rhs);

这个函数是传值返回,需要深拷贝,效率低少用为好

operator+=前面提到过

operator<<和operator>>

输入输出运算符重载,使用很简单,遇到空格或者换行结束

getline——获取一行字符串

std::getline (string)istream& getline (istream& is, string& str, char delim);//读到delim字符结束istream& getline (istream& is, string& str);//读到'\n'结束

relational operators——大小比较

relational operators (string)bool operator== (const string& lhs, const string& rhs);
bool operator== (const char*   lhs, const string& rhs);
bool operator== (const string& lhs, const char*   rhs);bool operator!= (const string& lhs, const string& rhs);
bool operator!= (const char*   lhs, const string& rhs);
bool operator!= (const string& lhs, const char*   rhs);bool operator<  (const string& lhs, const string& rhs);
bool operator<  (const char*   lhs, const string& rhs);
bool operator<  (const string& lhs, const char*   rhs);bool operator<= (const string& lhs, const string& rhs);
bool operator<= (const char*   lhs, const string& rhs);
bool operator<= (const string& lhs, const char*   rhs);bool operator>  (const string& lhs, const string& rhs);
bool operator>  (const char*   lhs, const string& rhs);
bool operator>  (const string& lhs, const char*   rhs);bool operator>= (const string& lhs, const string& rhs);
bool operator>= (const char*   lhs, const string& rhs);
bool operator>= (const string& lhs, const char*   rhs);
#include <iostream>
#include <vector>int main ()
{std::string foo = "alpha";std::string bar = "beta";if (foo==bar) std::cout << "foo and bar are equal\n";if (foo!=bar) std::cout << "foo and bar are not equal\n";if (foo< bar) std::cout << "foo is less than bar\n";if (foo> bar) std::cout << "foo is greater than bar\n";if (foo<=bar) std::cout << "foo is less than or equal to bar\n";if (foo>=bar) std::cout << "foo is greater than or equal to bar\n";return 0;
}

相关文章:

C++——string使用

string的常见构造接口 string() 构造空的srting类对象&#xff0c;空字符串 string(const char* str) 用字符串初始化 string(const string& str)拷贝构造&#xff0c;使用string类初始化string(size_t n, char c) 用n个字符c初始化 string s1; string s2("hello …...

10. selenium API (二)

目录 1. 多层框架/窗口定位 2. 下拉框处理 2.1 前端界面 2.2 代码 3. 针对 alert 弹窗进行操作 3.1 前端界面 3.2 代码 4. 文件提交 4.1 前端界面 4.2 代码 5. 显示等待 6. 操作浏览器滚动条 7. 截图 8. 浏览器关闭 9. 窗口切换 在上篇文章中&#xff0c;我们学…...

[国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送

用户报文协议(UDP)数据接收和发送 文章目录 用户报文协议(UDP)数据接收和发送1、UDP简单介绍2、W801的UDP创建逻辑2.1 UDP使用步骤2.2 代码实现1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS查找。它通过在数…...

JavaScript 生成 16: 9 宽高比

这篇文章只是对 for 循环一个简单应用&#xff0c;没有什么知识含量。 可以跳过这篇文章。 只是我用来保存一下我的代码&#xff0c;保存在本地我嫌碍眼&#xff0c;总想把他删了。 正文部分 公式&#xff1a;其中 width 表示宽度&#xff0c;height 表示高度 16 9 w i d t…...

HTML5之drawImage函数

参数说明&#xff1a; drawImage(image, x, y) //按原图片大小绘制。 drawImage(image, x, y, width, height) //按指定大小绘制。 drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) //常用于图片裁剪。 其中&#xff1a…...

leetcode7.整数反转-Java

题目 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 7. 整数反转 - 力扣&a…...

操作系统备考学习 day2 (1.3.2 - 1.6)

操作系统备考学习 day2 计算机系统概述操作系统运行环境中断和异常的概念系统调用 操作系统体系结构操作系统引导虚拟机 计算机系统概述 操作系统运行环境 中断和异常的概念 中断的作用 CPU上会运行两种程序&#xff0c;一种是操作系统内核程序&#xff0c;一种是应用程序。…...

Django-跨域

一、基础概念 cors 跨域资源共享 二、跨域请求-简单请求 满足以下全部条件的请求为 简单请求 1.请求方法如下&#xff1a; GET or HEAR or POS 2.请求头仅包含如下&#xff1a; Accept、Accept-Language、Content-Language、Content-Type 3.ConTent-Type 仅支持如下三种&…...

wireshark抓包体验

目录 1、使用基础 1.1 数据包筛选 1.2 MAC地址筛选 1.3 端口筛选 1.4 协议筛选 1.5 包长度筛选 1.6 http请求筛选 2.数据包搜索 3.数据包还原 2、例题复现 1、使用基础 1.1 数据包筛选 ip.src 源ip地址 同理可以得到筛选目标地址&#xff1a; ip.dst 目的ip地址 1.2 …...

Prometheus+grafana安装配置

Prometheus安装配置 Prometheus下载地址 官方地址&#xff1a;Download | Prometheus 可根据系统版本下载想要的安装包&#xff0c;复制链接地址 wget https://github.com/prometheus/prometheus/releases/download/v2.33.3/prometheus-2.33.3.linux-amd64.tar.gzwg 解压pr…...

长连接和短连接有什么区别?

长连接和短连接是什么&#xff1f; HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议&#xff0c;在传输层使用TCP协议&#xff0c;在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题&#xff0c;TCP协议主要解决如何在IP层之上可靠地传递数据包&…...

Qt应用开发(基础篇)——输入对话框 QInputDialog

一、前言 QInputDialog类继承于QDialog&#xff0c;是一个简单方便的对话框&#xff0c;用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项&#xff0c;文本标签用来告诉用户应该要输入…...

C++ struct 笔记(超级详细)

今日碎碎念&#xff1a;我在学C语言时经常用到结构体struct&#xff0c;之后在写C程序时遇到在struct中定义构造函数和成员函数的情况&#xff0c;这在c语言中是从未遇到过的&#xff0c;觉得奇怪&#xff0c;想到之前并没有真正系统学习C里的struct&#xff0c;有必要今天详细…...

Vue基础1:生命周期汇总(vue2)

Description 生命周期图&#xff1a; 可以理解vue生命周期就是指vue实例从创建到销毁的过程&#xff0c;在vue中分为9个阶段&#xff1a;创建前/后&#xff0c;载入前/后&#xff0c;更新前/后&#xff0c;销毁前/后&#xff0c;其他&#xff1b;常用的有&#xff1a;created&…...

Linux串口驱动

《I.MX6ULL 参考手册》第 3561 页的“Chapter 55 Universal Asynchronous Receiver/Transmitter(UART) I.MX6ULL串口原理 1.1UART与USART UART是异步通信&#xff0c;USART是异步/同步通信&#xff0c;比UART多了一条时钟线 USART 的全称是 Universal Synchronous/Asynchr…...

java反编译工具jd-gui使用

文章目录 一、JD-GUI介绍二、下载三、安装四、使用教程五、免责声明摘抄 一、JD-GUI介绍 JD-GUI是一个独立的图形实用程序&#xff0c;显示“.class”文件的Java源代码。 使用JD-GUI浏览重构的源代码&#xff0c;以便即时访问方法和字段。 二、下载 MAC安装包&#xff1a;ht…...

Linux 之 shell 脚本

Linux 之 shell 脚本 1、脚本的格式要求2、shell 脚本常用执行方式2.1、绝对路径或相对路径方式2.2、sh脚本方式&#xff08;不推荐&#xff09; 3、shell 的变量3.1、定义 shell 变量3.2、将命令返回值赋值给变量 &#xff08;重点&#xff09;3.3、设置环境变量3.4、位置参数…...

如何去阅读开源的第三方库的源码

2023年9月2日&#xff0c;周六晚上 今天探索了一天如何去阅读第三方库的源码&#xff0c;终有所获。 再结合以前看cereal项目的源码的经验&#xff0c;于是就有了这篇博客。 我个人认为&#xff1a; 在阅读一个开源的第三方库之前&#xff0c;要先学会这个第三方库的一些简单…...

浅析Linux虚拟网络技术

文章目录 概述Tap/tun设备tun/tap的工作机制 Bridge网桥Bridge的工作机制Bridge IP 相关参考 概述 在传统的网络环境中&#xff0c;一台物理主机包含一张或多张网卡&#xff0c;要实现与其它物理主机之间的通信&#xff0c;需要将自身的网卡通过路由器或者交换机连接到外部的物…...

设计模式之九:迭代器与组合模式

有许多方法可以把对象堆起来成为一个集合&#xff08;Collection&#xff09;&#xff0c;比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象&#xff0c;则需要知道具体是存在什么数据结构中&#xff08;如栈就用peek&#xff0c;数组[]&#xff09;。迭代器…...

T型翼/尾板导向的穿浪双体船姿态控制【附代码】

✨ 长期致力于穿浪双体船、T型翼、尾板、多自由度姿态控制、舒适性评估研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;动态水翼升力模型与耦合运动方…...

从‘文件夹’到对象列表:手把手教你用MinIO Java Client实现灵活的文件查询与过滤

从‘文件夹’到对象列表&#xff1a;手把手教你用MinIO Java Client实现灵活的文件查询与过滤在当今数据驱动的时代&#xff0c;对象存储已成为现代应用架构中不可或缺的一部分。MinIO作为高性能、兼容S3协议的开源对象存储解决方案&#xff0c;凭借其轻量级和易用性赢得了众多…...

Python基础语法:常用内置函数

round()&#xff1a;四舍五入 # 省略 ndigits print(round(3.14)) # 输出 3&#xff08;int&#xff09; print(round(3.66)) # 输出 4# 指定 ndigits print(round(3.14159, 2)) # 输出 3.14&#xff08;float&#xff09; print(round(3.666, 2)) # 输出 3.67# …...

Simulink中Repeating Sequence锯齿波显示恒为0解决方案

锯齿波设置如图1时&#xff0c;其示波器显示恒为0&#xff08;如图2&#xff09;。图1图2于是新建模型&#xff0c;只添加Repeating Sequence模块&#xff0c;采用原始设置发现可以正常输出锯齿波&#xff0c;于是调整时间参数&#xff0c;发现当时间设置为≥[0 0.06]时可以正常…...

VMware ESXi 9.1.0.0集成NVME+网卡驱动版发布|新特性+驱动集成+部署升级+FAQ全指南

一、ESXi 9.1.0.0 正式版核心新特性 VMware ESXi 9.1.0.0&#xff08;2026 年 5 月发布&#xff09;是 vSphere 9.1 核心组件&#xff0c;聚焦硬件兼容扩展、性能跃升、安全加固、运维简化四大方向&#xff0c;重点强化 NVMe 存储与网卡生态适配&#xff0c;以下为关键更新&am…...

光轮智能 谢晨 访谈总结机器人仿真数据产业

光轮智能 谢晨 访谈总结机器人仿真关于创始人关于数据数据金字塔数据痛点仿真数据的重要性仿真数据的质量b站链接地址公司官网关于创始人 清华物理&#xff1b;哥伦比亚金融&#xff1b;英伟达智驾仿真&#xff1b;小鹏智驾仿真&#xff1b;现为光轮智能CEO 关于数据 数据的…...

skills CANN开源社区贡献技能包开发指南

前言 开源社区的健康运转&#xff0c;不仅依赖核心代码的贡献&#xff0c;还需要降低贡献门槛、提供清晰的指南和自动化工具。skills仓库是CANN开源社区的"贡献技能包"&#xff0c;提供了一系列辅助脚本、代码模板、CI检查和文档生成工具&#xff0c;帮助新手快速上…...

Unity Visual Scripting不是拖拽玩具:中阶开发者的编程范式重构指南

1. 为什么Unity官方Visual Scripting不是“拖拽完就能跑”的玩具&#xff0c;而是一套需要重新理解的编程范式很多人第一次点开Unity的Visual Scripting&#xff08;VS&#xff09;面板时&#xff0c;看到那些五颜六色的节点和丝滑的连线&#xff0c;下意识觉得&#xff1a;“这…...

从开题到定稿零焦虑:okbiye AI 论文写作,帮你把毕业季的 “大山” 变成坦途

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 毕业季的深夜&#xff0c;宿舍台灯下的屏幕亮着刺眼的光&#xff0c;文档里的字数停留在三位数&#xff0c;而 deadline 正一天天逼近。你是…...

Allegro PCB设计小技巧:如何让Route Keepout区域既能走线又能打过孔(附详细步骤图)

Allegro PCB设计实战&#xff1a;Route Keepout区域的灵活控制技巧 在高速PCB设计中&#xff0c;Route Keepout区域的管理常常让工程师陷入两难境地——元件封装自带的限制区域与实际布线需求产生冲突。特别是处理PCIE等高速信号时&#xff0c;这种矛盾尤为突出。传统做法要么完…...