【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

人工智能:扩散模型(Diffusion Model)原理与图像生成实战

人工智能:扩散模型(Diffusion Model)原理与图像生成实战

人工智能:扩散模型(Diffusion Model)原理与图像生成实战 1.1 本章学习目标与重点 💡 学习目标:掌握扩散模型的核心原理、前向扩散与反向扩散过程,以及基于扩散模型的图像生成任务实战流程。 💡 学习重点:理解扩散模型的噪声添加与噪声消除机制,学会使用 PyTorch 搭建 DDPM 模型,完成手写数字图像生成任务。 1.2 扩散模型的核心思想 1.2.1 为什么需要扩散模型 💡 传统的生成模型(如 GAN)存在训练不稳定、模式崩溃等问题。扩散模型作为一种基于概率的生成模型,通过逐步添加噪声和逐步去除噪声的双向过程,实现了更稳定的训练和更高质量的生成效果。 扩散模型的灵感来源于非平衡热力学,它的核心是将复杂的生成问题拆解为多个简单的马尔可夫链步骤。在图像生成、文本生成、语音合成等领域,扩散模型的表现已经超越了传统生成模型。 1.2.2 扩散模型的基本框架 💡 扩散模型包含两个核心过程:前向扩散过程和反向扩散过程。 1. 前向扩散过程:从真实数据出发,

By Ne0inhk

2026年春节后,AI大模型格局彻底变了——Claude 4.6、GPT-5.2与六大国产模型全面横评

数据来源:Anthropic官方基准、VentureBeat、DigitalApplied、Latent Space等,测评截止日期:2026年2月19日。由于国内无法使用Claude和ChatGPT官网,因此使用镜像站可以使用ChatGPT和Claude。注册入口:AIGCBAR镜像站 春节刚过,AI圈炸了。 短短两周内,Anthropic发布Claude Sonnet 4.6与Opus 4.6、阿里云推出Qwen 3.5、智谱AI上线GLM-5、月之暗面发布Kimi K2.5、字节跳动推出Doubao 2.0……中美顶级AI实验室几乎同步拉开了2026年的"春季大战"。 这篇文章帮你搞清楚:谁最强?谁最划算?国产模型到底追上来了吗? 一、本次参测阵容 模型厂商发布时间架构参数量Claude Opus 4.6Anthropic(美)2026年2月Dense未公开Claude Sonnet 4.6Anthropic(

By Ne0inhk
人工智能:注意力机制与Transformer模型实战

人工智能:注意力机制与Transformer模型实战

人工智能:注意力机制与Transformer模型实战 1.1 本章学习目标与重点 💡 学习目标:掌握注意力机制的核心原理、经典注意力算法,以及Transformer模型的架构设计与实战应用。 💡 学习重点:理解自注意力与多头注意力的计算逻辑,学会使用TensorFlow搭建Transformer模型,完成机器翻译任务。 1.2 注意力机制的核心思想 1.2.1 为什么需要注意力机制 💡 传统的RNN和LSTM在处理长序列时,存在长距离依赖捕捉能力不足和并行计算效率低的问题。注意力机制的出现,解决了这两个核心痛点。 注意力机制的本质是让模型学会“聚焦”——在处理序列数据时,自动分配不同的权重给输入序列中的各个元素,重点关注与当前任务相关的信息,弱化无关信息的干扰。 比如在机器翻译任务中,翻译“我爱中国”时,模型会给“我”“爱”“中国”分配不同的注意力权重,从而更精准地生成对应的英文翻译。 1.2.2 注意力机制的基本框架 💡 注意力机制的计算通常包含**查询(Query)、键(Key)、值(

By Ne0inhk
AI 进化论:从 Function Calling 到 MCP

AI 进化论:从 Function Calling 到 MCP

AI 进化论:从 Function Calling 到 MCP,你的大模型还在“裸奔”吗? 文章目录 * AI 进化论:从 Function Calling 到 MCP,你的大模型还在“裸奔”吗? * 一、 给 AI 装上手脚:Function Calling 到底是个啥? * 1. 专业解释与大白话解读 * 2. 核心功能与代码示例 * 二、 实战演练:搭建你的“门票数据助手” * 1. 业务场景介绍 * 2. 进阶:一次调用,搞定查询 + 可视化 * 三、 MCP:AI 界的“USB-C”接口协议来了! * 1.

By Ne0inhk