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();
相关文章:
C++字符串相关内容
字符串 字符串,本质上是一个接一个字符的一组字符。字母、数字、符号等。 const char* 字符串名 字符后面会有一个空终止符,为0。 字符串从指针的内存地址开始,然后继续下去,直到它碰到0,然后意识到字符串终止了。 …...
利用二分法进行 SQL 时间盲注
什么是时间盲注? SQL 盲注(Blind SQL Injection)是一种常见的 Web 安全漏洞,其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时,我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …...
数据库管理-第293期 奇怪的sys.user$授权+(20250210)
数据库管理293期 2025-02-10 数据库管理-第293期 奇怪的sys.user$授权(20250210)1 清空shared pool2 SR反馈总结 数据库管理-第293期 奇怪的sys.user$授权(20250210) 作者:胖头鱼的鱼缸(尹海文)…...
react实例与总结(一)
目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…...
电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)
根据合宙的AT研发推荐, AT指令基本上也简单看完了,这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发,将以前复杂的设备通讯方式转换成简单的串口编程, 大大简化了产品的硬件设计和软件开发成本,这使得几乎所…...
Qt 数据库SQLite 使用【01】基本功能
1.开发背景 Qt 开发过程中难免需要存储数据,可以选择保存到本地文件,但是查找比较麻烦,所以就有了数据库,主要是方便查找数据,增删改查等操作,而 SqLite 属于数据库中轻量级的存在,适合本地数据…...
stm32小白成长为高手的学习步骤和方法
我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解,请立即阅读STM32的文档,以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程,初学者可以看看,讲的真心不错。 英文好的同学…...
大模型产品Deepseek(五)、本地安装部署(Docker方式)
DeepSeek 本地部署指南 DeepSeek是一款高效的智能搜索与推荐引擎,除了通过云端API提供服务外,它还支持本地部署,让开发者可以完全控制数据和计算资源。通过本地部署,您可以将DeepSeek集成到内部系统中,在私有环境下运行模型,减少对外部API的依赖,同时提升数据隐私性与响…...
Kafka 的消费offset原来是使用ZK管理,现在新版本是怎么管理的?
目录 基于 ZooKeeper 管理消费 offset 原理 缺点 新版本基于内部主题管理消费 offset 原理 优点 示例代码(Java) 在 Kafka 早期版本中,消费者的消费偏移量(offset)是存储在 ZooKeeper 中的,但由于 ZooKeeper 并不适合高频读写操作,从 Kafka 0.9 版本开始,消费偏…...
基于改进型灰狼优化算法(GWO)的无人机路径规划
内容: 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法,模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性,比如容易陷入局部最优,收敛速度慢等,所以改进型的GWO可能通过不同的策略来优化这些…...
JS中|=是什么意思?
在JavaScript中,| 是一个位运算符的复合赋值操作,具体表示按位或赋值运算。这个操作符会对两个操作数进行按位或(|)运算,然后将结果赋值回左操作数。 let a 5; // 二进制表示为 0101let b 3; // 二进制表示为 0011a …...
快速上手Vim的使用
Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式(ctrlV进入) Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑,甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...
RPA与深度学习结合
什么是RPA RPA即机器人流程自动化(Robotic Process Automation),它是一种利用软件机器人模拟人类在计算机上的操作,按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...
在阿里云ECS上一键部署DeepSeek-R1
DeepSeek-R1 是一款开源模型,也提供了 API(接口)调用方式。据 DeepSeek介绍,DeepSeek-R1 后训练阶段大规模使用了强化学习技术,在只有极少标注数据的情况下提升了模型推理能力,该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…...
长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾
2月9日,长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元,携手众多“中国智驾合伙人”,共同开启全民智驾元年。 发布会上,长安…...
Aitken 逐次线性插值
Aitken 逐次线性插值 用 Lagrange 插值多项式 L n ( x ) L_n(x) Ln(x)计算函数近似值时,如需增加插值节点,那么原来算出的数据均不能利用,必须重新计算。为克服这个缺点,可用逐次线性插值方法求得高次插值。 令 I i 1 , i 2…...
docker 安装 Prometheus、Node Exporter 和 Grafana
Docker Compose 配置文件 docker-compose.yml services:prometheus:image: prom/prometheus:latestcontainer_name: prometheusvolumes:- ./prometheus.yml:/etc/prometheus/prometheus.yml # 挂载配置文件 - prometheus_data:/prometheus # 持久化数据存储 command:- --…...
【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)
🚀 力扣热题 74:搜索二维矩阵(详细解析) 📌 题目描述 力扣 74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵 matrix : 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的…...
元数据、数据元、数据元素、数据项 和 主数据的概念
一、元数据 1.概念 元数据,又称中介数据、中继数据,为描述数据的数据。主要是描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 2.实例 数据库中,表的名称、表字段名、其他相关的描述信息&a…...
阿里云cdn怎样设置图片压缩
阿里云 CDN 提供了图像加速服务,其中包括图像压缩功能。通过设置图片压缩,可以显著减小图片文件的体积,提升网站加载速度,同时减少带宽消耗。九河云来告诉你如何进行图片压缩吧。 如何设置阿里云 CDN 图片压缩? 1. 登…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
