【C++】string

【C++】string

个人主页:NiKo 

C++专栏:C++程序设计

目录

一、标准库中的string类

二、string的遍历

三、string容量

四、string修改


一、标准库中的string类

1、string类

        C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。 

        在使用string类时,必须包含#include头文件以及using namespace std;

#include <string> using namespace std;

2、string的构造方法

string一共有5种构造方法。string()无参构造,初始化为空串string(const string& str) 用str拷贝构造string(size_t n,char c)用n个字符c初始化string(const char* s,size_t n)用字符串s的前n个字符初始化string(const string& str,size_t pos,size_t len=npos)将字符串str,从下标pos位置开始,选取长度为len个的字符,来初始化注:上面的缺省值npos,定义为:size_t npos=-1. npos为最大值,表示不传参数时,会用str中pos位置开始后的所有字符来初始化

二、string的遍历

1、auto和范围for(C++11支持)

补充auto的相关语法:

        1、在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

        2、用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&;当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

        3、auto不能作为函数的参数,可以做返回值,但是建议谨慎使用

        4、auto不能直接用来声明数组        5、auto的用武之地

范围for:        对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。范围for可以作用到数组和容器对象上进行遍历。

2、迭代器(iterator)

  • string 中的迭代器主要分为正向迭代器和反向迭代器,其中又可以细分为 const 和 非const类型的,共计四种。
  • const迭代器仅定义方式与非const不同,且在循环内部不能对元素进行修改,其余的都相同
begin+end
begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器('\0')
rbegin+rend
rend获取第一个字符的前一个位置迭代器 + rbegin获取最后一个字符下一个位置的迭代器

正向迭代器

非constconst

反向迭代器

非constconst

3、operator[]

通过索引访问类中的字符数据

三、string容量

1、length和size

返回字符串中有效字符的长度size()与length()方法底层实现原理完全相同,二者没有本质的区别,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

2、capacity

返回字符串存储有效字符的空间大小(不包含'\0')capacity的扩容机制

       capacity()在不同平台上的扩容方式不同。先展示Windows下capacity的扩容过程。

        在Windows系统上,使用Visual Studio 2022编译器时,容器的capacity首次扩容遵循二倍增长策略(例如,从16扩展到32),而随后的扩容则调整为1.5倍增长。

        相比之下,在Linux系统上,当采用g++ 4.8编译器且演示代码保持完全一致的情况下,容器的初始capacity被设置为1,并且无论是首次还是后续的扩容操作,均严格遵循二倍增长模式。

3、reserve

用于预分配足够的内存空间以容纳指定数量的字符。这个函数不会改变字符串的内容或长度,但它可以影响字符串的 capacity

        reserve()函数在字符串管理中的主要作用是预分配足够的内存空间,以减少因后续操作(如添加字符)导致的频繁扩容,从而提升性能。这一功能在不同平台上可能因标准库实现的具体细节而有所差异。

        在Visual Studio环境下,当传入的参数n大于字符串当前的容量时,reserve()函数会确保字符串的容量增加至至少n个字符或更大。如果n小于或等于当前容量,调用reserve(n)通常不会有任何效果,因为字符串已经有足够的空间来存储n个字符。

        在Linux平台上,使用g++等编译器时,reserve()函数的行为通常与Visual Studio相似。当n大于当前容量时,它会将字符串的容量调整为至少n个字符。然而,与Visual Studio不同的是,在Linux平台上,如果n小于或等于当前容量,字符串的容量将会缩减(至少为size)。

四、string修改

1、push_back

void push_back (char c);在字符串的末尾添加一个字符

2、append

​​​​​​string& append (const string& str);​在字符串的末尾添加另一个字符串的内容

3、operator+=

string& operator+= (const string& str);将右侧字符串的内容追加到左侧字符串的末尾

 4、insert

string& insert (size_t pos, const string& str);在字符串的指定位置插入另一个字符串的内容

5、erase

string& erase (size_t pos = 0, size_t len = npos);从字符串中删除字符

6、find 

size_t find (const string& str, size_t pos = 0)在string中查找字符并返回指定字符串的下标(如果找不到则会返回-1

Read more

适合新手的Open-AutoGLM项目:自动打卡签到机器人

适合新手的Open-AutoGLM项目:自动打卡签到机器人 你是否每天早上手忙脚乱地打开企业微信、钉钉或飞书,反复点击“打卡”按钮,生怕迟到被扣分? 是否试过设闹钟提醒,却在匆忙中漏点、点错、甚至忘记切换Wi-Fi导致定位失败? 有没有想过——让AI替你完成这件事,而且只需一句话:“帮我今天上午9点准时在钉钉打卡”。 这不是科幻设想。借助智谱开源的 Open-AutoGLM 项目,一个真正能“看懂手机屏幕、理解你的指令、动手操作App”的AI代理,已经能在你的本地电脑+真机组合上稳定运行。它不依赖云端API调用,不上传截图,不越权读取通讯录,只做一件事:像你一样,用手指完成打卡任务。 本文不是讲大模型原理,也不是堆参数对比。这是一份专为新手准备的、从零开始搭建「自动打卡签到机器人」的实操指南。全程无需写一行推理代码,不碰CUDA配置,不调试vLLM服务——你只需要一台Windows/macOS电脑、一部安卓手机、15分钟耐心,就能让AI替你按下那个熟悉的“打卡”按钮。 我们不谈“

By Ne0inhk

从零开始学AI绘画:麦橘超然WebUI新手入门必看

从零开始学AI绘画:麦橘超然WebUI新手入门必看 你是不是也试过打开一堆AI绘画工具,结果卡在安装、报错、显存不足、界面找不到按钮……最后关掉网页,默默刷了半小时小红书?别急,这次真不一样。麦橘超然WebUI不是又一个“看着很炫、用着崩溃”的Demo,而是一个专为普通用户打磨出来的离线图像生成控制台——它不挑显卡,不折腾环境,打开浏览器就能画;它不堆参数,不讲原理,但每一步都稳稳出图;它甚至把最让人头疼的“模型下载”和“量化加载”全打包进镜像里,你只需要写一句话、点一下按钮。 这篇文章就是为你写的。没有术语轰炸,没有命令行恐惧,不假设你懂CUDA、不预设你有3090。哪怕你只有一块RTX 3060,或者刚配好一台带核显的笔记本,只要能跑Python,就能跟着这篇实操指南,15分钟内跑通属于你自己的Flux图像生成服务。我们不讲“为什么float8快”,只告诉你“为什么你点下按钮后30秒就出高清图”;不罗列DiT架构细节,只展示怎么用一句“雨夜赛博朋克街道”生成一张能发朋友圈的成片。 准备好了吗?我们直接开始。

By Ne0inhk

Pi0效果展示:跨域迁移能力——仿真训练模型在真实机器人零样本适配

Pi0效果展示:跨域迁移能力——仿真训练模型在真实机器人零样本适配 1. 什么是Pi0?一个能“看懂”任务并直接指挥机器人的新模型 你有没有想过,让机器人像人一样——看到一张桌子、听到一句“把左边的杯子拿过来”,就能立刻理解该做什么、怎么做?不是靠一堆预设程序,也不是靠反复调试参数,而是真正理解视觉信息和语言指令之间的关系,再输出精准的动作序列。 Pi0就是朝着这个方向迈出的关键一步。它不是一个传统意义上的“视觉识别模型”或“语言大模型”,而是一个视觉-语言-动作流模型(Vision-Language-Action Flow Model)。简单说,它把“眼睛”“耳朵”和“手”连成了一条通路:输入三路图像(主视、侧视、顶视)+ 当前机械臂关节状态 + 一句自然语言指令,直接输出下一步6个自由度的关节动作增量。 更关键的是,Pi0的训练数据完全来自仿真环境——没有用过一台真实机器人采集的数据。但它在部署到真实机械臂时,不需任何微调、不需真实数据反馈、不需重新训练,就能生成合理、

By Ne0inhk

OpenClaw多智能体路由实战:飞书多机器人配置指南

文章目录 * 飞书重新安装问题 * 批量增加机器人 * 缺点 * 多个飞书机器人名称包含大小写的问题 * 多个Agent名称包含大小写的问题 目前我已经完成了OpenClaw的基本安装,但是在对话框只有一个,机器人也只绑定到主会话,一次只能处理一个消息。很多时候我在聊天窗口,说A任务,然后做了一半,又发了关于B任务的指令。一是每次发完消息,如果OpenClaw还在处理,剩下的消息要么进入队列、要么看不到(实际还在队列)。两个任务切来切去,感觉体验很不好。 要彻底解决这个问题,实现网上演示的那种对各Agent、每个对话机器人对应一个Agent,就需要用到多智能体路由技术。 实现的步骤如下: * 在飞书创建一个新的机器人 * 通过控制台创建新的智能体 * 按照指引将飞书配置上去 * 根据需要创建多个Agent和机器人,并对应配置上去(略) 飞书重新安装问题 明明我已经安装好了飞书,系统还是会提示我安装,否则就跳过了添加飞书这步。应该是系统Bug。这次安装的飞书位置在~/.openclaw/extensions/feishu,其实和~/.npm-globa

By Ne0inhk