C++字符串相关内容

字符串

字符串,本质上是一个接一个字符的一组字符。字母、数字、符号等。

const char*  字符串名

字符后面会有一个空终止符,为0。

字符串从指针的内存地址开始,然后继续下去,直到它碰到0,然后意识到字符串终止了。

#include <iostream>
int main()
{const char* name = "Miles";  //使用const之后,就不能再改变该字符串的内容。//name[2] = "a";char name2[5] = {'M','i','l','e','s'};std::cout << name << std::endl;std::cout << name2 << std::endl;std::cin.get();
}

为了使得代码更加简洁,通常会引入string。

string中有一个构造函数,它接收char*或const char*参数。

#include <iostream>
#include <string>
int main()
{std::string name1 = "Miles";std::cout << name1 << std::endl;std::cin.get();
}

std::string 是一个有很多功能的类。

name.size()可以找到其尺寸;strlen(),字符串的长度;strcpy,复制字符串;

字符串相加,可以考虑重载运算符:“+=”。

#include <iostream>
#include <string>
int main()
{std::string name1 = "Miles";name1 += " hello!";std::cout << name1 << std::endl;std::cin.get();
}
//输出:
//Miles hello!

字符串相加,或者可以用另一种方法进行:将两个相加的字符数组的其中一个,显式调用一个string构造函数。相当于创建了一个字符串,然后附加这个字符串给另一个。

#include <iostream>
#include <string>
int main()
{std::string name1 = std::string("Miles")+ " hello!";std::cout << name1 << std::endl;std::cin.get();
}
//输出:
//Miles hello!

如果要寻找字符串中的文本,可以使用name.find()。

#include <iostream>
#include <string>
int main()
{std::string name1 = std::string("Miles")+ " hello!";bool contains = name1.find("es") != std::string::npos;  std::cout << name1 << std::endl;std::cin.get();
}

其中,std::string::npos代表一个不存在的位置。将结果给contains。

#include <iostream>
#include <string>
void PrintString(std::string string)
{string += "h";std::cout << string << std::endl;
}
int main()
{std::string name1 = std::string("Miles")+ " hello!";PrintString(name1);bool contains = name1.find("es") != std::string::npos;  std::cout << name1 << std::endl;std::cin.get();
}
//输出:
//Miles hello!h
//Miles hello!

需要分配一个全新的char数组,来存储我们已经得到的完全相同的文本。

字符串复制,实际上相当慢。

当我们需要传递一个字符串,而且在只读的情况下,需要确保通过常量引用传递它。此时通常在前面加上const和引用&。

void PrintString(const std::string& string)
{//string += "h";std::cout << string << std::endl;
}

字符串字面量

字符串字面量,是在双引号之间的一串字符。

字符串后面有一个额外的字符,叫做:空终止字符。

#include <iostream>
#include <string>#include <stdlib.h>
int main()
{const char name[7] = "Mi\0les";std::cout << strlen(name) << std::endl; //打印出字符串的长度。std::cin.get();
}

字符串的相加,还能用到string_literals库。在字符串后面加上s,即可实现字符串的相加。

#include <iostream>
#include <string>
#include <stdlib.h>
int main()
{using namespace std::string_literals;std::string name = "Miles"s + " hello!";std::cout << name << std::endl; std::cin.get();
}
//输出:
//Miles hello!

其中,s实际上是一个函数。操作符函数,它返回标准字符串(对象)。

R可以用来忽略转义字符。使得代码更加简洁。

#include <iostream>
#include <string>#include <stdlib.h>
int main()
{const char* example = R"(Line1
line2
line3)"  ;//R忽略转义字符const char* ex = "Line1\n""line2\n""line3\n";std::cout << example << std::endl;std::cout << ex << std::endl;std::cin.get();
}

字符串字面量永远保存在内存的只读区域,

关键字const

关键字

const,称为伪关键字。因为它在改变生成代码方面做不了什么。有点像类和结构体的可见性。

#include<iostream>
#include<string>
int main()
{const int MAX_AGE = 90;std::cin.get();
}

在堆上建立一个整数,就能得到一个指针。此时有两个方案:

  • 逆向引用dereference
  • 重新分配实际的指针,这样会指向别的东西

用const强制定义一个变量为只读常量。但可以强制改变这个定义,如下,利用(int*)可以将const只读常量的值,逆向引用传给另一个变量。

#include<iostream>
#include<string>
int main()
{const int MAX_AGE = 90;int* a = new int;*a = 2;a = (int*)&MAX_AGE;std::cout << *a << std::endl;std::cin.get();
}
//输出:
//90

但,const int* 意味着,不能修改指针指向的内容。该用法和int const*一致。

const int* a = new int;
int const* a = new int;

int* const可以改变指针指向的内容,但不能把实际的指针本身重新赋值,指向别的东西

#include<iostream>
#include<string>
class Entity
{
private:int m_X, m_Y;
public:int GetX() const //此用法,只能读,不能写。该方法只能进行读操作,不能进行其他的修改操作。{return m_X;}void SetX(int x){m_X = x;}
};
int main()
{const int MAX_AGE = 90;int* a = new int;*a = 2;a = (int*)&MAX_AGE;std::cout << *a << std::endl;std::cin.get();
}

如果用再次复制Entity类的方式,需要分配空间,那样会很慢。可以通过常量引用传递的方式。也就是:const Entity& e

#include<iostream>
#include<string>
class Entity
{
private:int m_X, m_Y;
public:int GetX() const{return m_X;}void SetX(int x){m_X = x;}
};
void PrintEntity(const Entity& e)
{std::cout << e.GetX() << std::endl; //由于GetX()用到了const,才能在这里用到e.GetX()
}
int main()
{const int MAX_AGE = 90;int* a = new int;*a = 2;a = (int*)&MAX_AGE;std::cout << *a << std::endl;std::cin.get();
}

如果要对int GetX() const中的变量进行修改的话,可以引入mutable:

#include<iostream>
#include<string>
class Entity
{
private:int m_X, m_Y;mutable int var;
public:int GetX() const{var = 2;return m_X;}void SetX(int x){m_X = x;}
};

mutable允许函数是常量的方法,可以修改变量。

关键字mutable

mutable的两种不同用途:

  • 与const一同使用。
  • 用在lambda表达式中。

或者mutable可以同时覆盖两种情况。

#include <iostream>
#include <string>
class Entity
{
private:std::string m_Name;mutable int m_DebugCount;
public:const std::string& GetName() const{m_DebugCount++;  //每次调用get的时候,都会记一次数return m_Name;}
};
int main()
{const Entity e;e.GetName();std::cin.get();
}

在类成员中使用mutable。

lambda基本上像一个一次性的小函数,可以写出来并赋值给一个变量。

#include <iostream>
#include <string>class Entity
{
private:std::string m_Name;mutable int m_DebugCount;
public:const std::string& GetName() const{m_DebugCount++;  return m_Name;}
};
int main()
{const Entity e;e.GetName();
//lambda的使用如下:int x = 8;auto f = [&](){x++;std::cout << x << std::endl;};f();std::cin.get();
}

lambda还有其他的用法,三种auto用法一致。

int x = 8;
auto f = [&]()
{x++;std::cout << x << std::endl;
};
auto f = [=]() mutable
{x++;std::cout << x << std::endl;
};
auto f = [=]()
{int y = x;y++;std::cout << x << std::endl;
};
f();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15341.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MQ】Spring3 中 RabbitMQ 的使用与常见场景

一、初识 MQ 传统的单体架构&#xff0c;分布式架构的同步调用里&#xff0c;无论是方法调用&#xff0c;还是 OpenFeign 难免会有以下问题&#xff1a; 扩展性差&#xff08;高耦合&#xff0c;需要依赖对应的服务&#xff0c;同样的事件&#xff0c;不断有新需求&#xff0…

GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读

一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览&#xff1a; 国家标准|GB/T 43698-2024 相关标准&#xff1a; &a…

Linux系统-centos防火墙firewalld详解

Linux系统-centos7.6 防火墙firewalld详解 1 firewalld了解 CentOS 7.6默认的防火墙管理工具是firewalld&#xff0c;它取代了之前的iptables防火墙。firewalld属于典型的包过滤防火墙或称之为网络层防火墙&#xff0c;与iptables一样&#xff0c;都是用来管理防火墙的工具&a…

Gitlab中如何进行仓库迁移

需求&#xff1a;之前有一个自己维护的新仓库A&#xff0c;现在需要将这个仓库提交并覆盖另一个旧的仓库B&#xff0c;需要保留A中所有的commit信息。 1.方法一&#xff1a;将原有仓库A导出后再导入到新的仓库B中 适用场景&#xff1a;新的仓库B是一个待建仓库&#xff0c;相当…

微信点餐系统小程序ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

01单片机上电后没有正常运行怎么办

单片机上电后没有运转, 首先要检查什么? 1、单片机供电是否正常? &电路焊接检查 如果连最基本的供电都没有,其它都是空谈啊!检查电路断路了没有?短路了没有?电源合适吗?有没有虚焊? 拿起万用表之前,预想一下测量哪里?供电电压应该是多少?对PCB上电压测量点要…

【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java基础面经 &#x1f4da;本系列文章为个…

c++ haru生成pdf输出饼图

#define PI 3.14159265358979323846 // 绘制饼图的函数 void draw_pie_chart(HPDF_Doc pdf, HPDF_Page page, float *data, int data_count, float x, float y, float radius) { float total 0; int i; // 计算数据总和 for (i 0; i < data_count; i) { tot…

Linux 创建进程 fork()、vfork() 与进程管理

Linux 创建进程 fork、vfork、进程管理 一、Linux的0号、1号、2号进程二、Linux的进程标识三、fork() 函数1、基本概念2、函数特点3、用法以及应用场景&#xff08;1&#xff09;父子进程执行不同的代码&#xff08;2&#xff09;进程执行另一个程序 4、工作原理 四、vfork() 函…

【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归&#xff08;Ridge Regression&#xff09;中的 α 值 岭回归&#xff08;Ridge Regression&#xff09;是一种 带有 L2​ 正则化 的线性回归方法&#xff0c;用于处理多重共线性&#xff08;Multicollinearity&#xff09;问题&#xff0c;提高模型的泛化能力。其中&am…

电脑重启后vscode快捷方式失效,找不到code.exe

今天打开电脑发现vscode的快捷方式失效了&#xff0c;提示code.exe被删除或移动。 解决方法 查看vscode安装目录&#xff0c;发现多了一个_文件夹&#xff0c;包括code.exe在内的其他文件都被移动到了这个文件夹下。 将里面内容都移动到microsoft vs code文件夹下&#xff0c…

[权限提升] Linux 提权 维持 — 系统错误配置提权 - Sudo 滥用提权

关注这个专栏的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;Sudo 滥用提权原理 Sudo 是一个 Linux 系统管理命令&#xff0c;它允许系统管理员授予普通用户以指定身份执行指定命令的权限。该命令不仅减少了 Root 用户的登录时间和管理时…

激活函数篇 04 —— softmax函数

将模型的输出转换为概率分布&#xff0c;使得模型能够输出每个类别的概率值。 Softmax ( a i ) e a i ∑ j 1 n e a j \text{Softmax}(a_i)\frac{e^{a_i}}{\sum_{j1}^n e^{a_j}} Softmax(ai​)∑j1n​eaj​eai​​ 其中&#xff0c; a i a_i ai​ 是输入向量中的第 i i i 个…

【韩顺平linux】部分上课笔记整理

整理一下一些韩顺平老师上课时候的笔记 课程&#xff1a;【小白入门 通俗易懂】韩顺平 一周学会Linux linux环境&#xff1a;使用阿里云服务器 笔记参考 &#xff1a; [学习笔记]2021韩顺平一周学会Linux 一、自定义函数 基本语法 应用实例&#xff1a; 计算两个参数的和…

redis底层数据结构——简单动态字符串

文章目录 概述什么时候用C里面的字符串什么时候使用SDS使用场景 SDS定义SDS与C语言的字符串差异常数时间复杂度获取字符串长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数1.空间预分配2.情性空间释放 二进制安全兼容部分C字符串函数总结 开始讲述动态字符串前我们先问…

使用 POI-TL 和 JFreeChart 动态生成 Word 报告

文章目录 前言一、需求背景二、方案分析三、 POI-TL JFreeChart 实现3.1 Maven 依赖3.3 word模板设置3.2 实现代码 踩坑 前言 在开发过程中&#xff0c;我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart&#xff0c;实现动态生成 W…

VLLM历次会议(2024.1)

Azure官宣支持VLLM VLLM支持AMD芯片 支持Mixtral MoE&#xff0c;支持DeepSeek MoE 性能优化 &#xff08;以下4招&#xff0c;总共将吞吐量提升50%&#xff0c;延迟降低40%&#xff09; 1. PageAttention V2 &#xff08;同一个Q&#xff0c;和不同的KV的计算&#xff0c…

第一财经对话东土科技 | 探索工业科技新边界

当前以ChatGPT、Sora等为代表的生成式人工智能快速发展&#xff0c;越来越多面向垂直场景的行业大模型涌现出来&#xff0c;并成为推动制造业智能化改造与数字化转型、加快推进新型工业化&#xff0c;进而培育发展新质生产力的新引擎。 在垂类场景的应用落地&#xff0c;是AI发…

RabbitMq入门

1.MQ的相关概念 1.1 什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xf…

【报错解决】MySQL报错:sql_mode=only_full_group_by

文章目录 报错信息 DataGrip 报错还原Navicat 报错还原 报错原因解决方案 查看当前 sql mode方案一&#xff1a;临时解决方案二&#xff1a;永久解决方案三&#xff1a;使用 any_value() 或 group_concat()方案四&#xff1a;调整实现思路&#xff0c;避开 GROUP BY 使用 我…