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

std::string

std::string是C++标准库中的一个基本类模板,专门用于处理字符串。它提供了一个可变长度的字符序列,以及一系列用于字符串操作的方法。std::string是值类型,这意味着当它作为函数参数传递或赋值时,整个字符串数据会被复制。

std::string的特性:

  • 可变长度:std::string可以动态地调整大小以存储不同长度的字符串
  • 随机访问:std::string可以通过索引随机访问字符
  • 自动内存管理:无需手动管理内存,std::string会自动分配和释放内存
  • 模板类:std::string是一个模板类,但通常用于char类型的字符串

std::string对象通常包含了一个指向堆上分配的内存的指针,用于存储较长的字符串。较短的字符串可能会直接存在对象本身的内部缓冲区,有些实现还会使用一个独立的缓冲区来存储字符串内容。

std::string提供了一系列成员函数来操作对象:

  • 构造函数

    • std::string():默认构造一个空字符串

    • std::string(const char* str):从C风格字符串构造

    • std::string(const std::string& str):拷贝构造函数,深拷贝

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::cout << str << std::endl;  // abc12345std::string new_str1(str);  // 拷贝构造,深拷贝
      std::cout << str << std::endl;  // abc12345
      std::cout << new_str1 << std::endl;  // abc12345std::string new_str2(std::move(str));  // 移动构造
      std::cout << str.size() << std::endl;  // 0
      std::cout << new_str2 << std::endl;  // abc12345
      
      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      const char* cstr = str.c_str();  // c_str()返回指向字符串第一个字符的指针
      std::cout << *cstr << std::endl;  // a
      std::cout << cstr << std::endl;  // abc12345c_str()返回的指针指向的是一个只读的C风格字符串,这意味着不能通过这个指针来修改std::string对象中字符串的内容。
      
  • 赋值操作

    • 赋值运行符 =:将一个字符串的内容复制给另一个字符串

    • swap(std::string& other):交换两个字符串的内容

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化std::string new_str = str;  // 赋值操作,深拷贝
      std::cout << str << std::endl;  // abc12345
      std::cout << new_str << std::endl;  // abc12345std::string swap_str = "678";
      str.swap(swap_str);  // 交换两个字符串
      std::cout << str << std::endl;  // 678
      std::cout << swap_str << std::endl;  // abc12345
      
  • 连接字符串

    • operator +:连接两个字符串

    • operator +=:将另一个字符串连接到当前字符串

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::string new_str = "678";std::string conn_str = str + new_str;  // 连接字符串
      std::cout << conn_str << std::endl;  // abc12345678
      
  • 访问字符

    • operator[]:通过索引访问字符串中的字符

    • at(size_type n):通过索引访问字符串中的字符,带边界检查

    • front():返回字符串中的第一个字符

    • back():返回字符串中的最后一个字符

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::cout << str[1] << std::endl;  // 访问索引为1的字符,b
      std::cout << str.at(7) << std::endl;  // 访问索引为7的字符,5
      std::cout << str.front() << std::endl;  // 返回第一个字符,a
      std::cout << str.back() << std::endl;  // 返回最后一个字符,5
      
  • 查找和替换

    • find():在字符串中查找子字符串或字符

    • replace():替换字符串中的部分内容

      std::string str = "abc12345cba";  // 创建一个字符串,并进行初始化
      std::cout << str.find("b") << std::endl;  // 查找字符串中从左到右的第一个字符b,并返回其索引,1
      std::cout << str.rfind("b") << std::endl;  // 查找字符串中从右到左的第一个字符b,并返回其索引,9
      std::cout << str.find("abc") << std::endl;  // 查找字符串中的子字符串,返回其开头索引,0
      std::cout << str.find("abcd") << std::endl;  // 若查找不到子字符串或字符,则返回一个随机数,18446744073709551615str.replace(3, 5, "321");  // 从索引为3的字符开始,将5个字符换成321
      std::cout << str << std::endl;  // abc321cba
      
  • 修改字符串

    • push_back(char ch):在字符串末尾添加一个字符

    • pop_back():移除字符串末尾的字符

    • append(std::string& other):在字符串末尾添加一个字符串

    • erase():删除字符串中的指定位置或指定范围的字符

    • assign(std::string& other):用新的字符串替换原有内容

    • insert():在指定位置插入字符或字符串

    • resize():修改字符串的大小

    • clear():清空字符串

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化str.push_back('A');  // 字符串末尾添加一个字符
      std::cout << str << std::endl;  // abc12345Astr.pop_back();  // 移除字符串末尾的字符
      std::cout << str << std::endl;  // abc12345str.append("678A");  // 字符串末尾添加字符串
      std::cout << str << std::endl;  // abc12345678Astr.erase(5);  // 删除字符串中索引为5及以后的字符
      std::cout << str << std::endl;  // abc12
      str.erase(1, 3);  // 删除字符串中索引从1开始的3个字符
      std::cout << str << std::endl;  // a2str.assign("678");  // 用新的字符串替换掉原来的字符串
      std::cout << str << std::endl;  // 678str.clear();  // 清空字符串
      std::cout << str.size() << std::endl;  // 0
      
  • 子字符串

    • substr():提取子字符串

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::string sub_str = str.substr(2, 4);  // 提取从索引2开始共4个字符的子字符串
      std::cout << sub_str << std::endl;  // c123
      
  • 容量

    • length():返回字符串的长度

    • size():返回字符串中的字符数量,也就是字符串长度

    • capacity():返回字符串的容量

    • reserve():更改容量

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::cout << str.length() << std::endl;  // 8
      std::cout << str.size() << std::endl;  // 8
      std::cout << str.capacity() << std::endl;  // 15str.push_back('6');
      std::cout << str.capacity() << std::endl;  // 15str.reserve(20);  // 更改容量,容量会变得更大,但不一定是给出的值,因为容量的变化是按照指数或线性规律来的
      std::cout << str.capacity() << std::endl;  // 31长度表示字符串当前实际包含的字符数,而容量表示分配给字符数组的内存空间大小。当字符串的长度超过容量时,std::string会重新分配更大的内存空间,并将原有的字符复制到新的内存位置。当std::string对象的生命周期结束时,它会自动释放所分配的内存,不需要手动调用delete或free()释放字符串的内存,因为std::string类会在对象销毁时自动调用相应的析构函数来释放内存。与C语言中的字符串类似,std::string的底层实现也会在字符数组的末尾添加一个空终止字符(‘\0’),以表示字符串的结束。这样可以使得std::string类的接口与标准C字符串函数兼容,但是std::string的size()length()不会统计('\0')。
      
  • 迭代器

    • begin():返回指向第一个字符的迭代器

    • end():返回指向尾后一位的迭代器

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      for (auto it = str.begin(); it != str.end(); ++it) {std::cout << *it << std::endl;  // a b c 1 2 3 4 5
      }
      for (auto value : str) {std::cout << value << std::endl;  // a b c 1 2 3 4 5
      }
      
  • 其他成员函数

    • data():返回指向字符串第一个字符的指针
    • c_str():返回指向字符串第一个字符的指针
    • empty():检查字符串是否为空

相关文章:

std::string

std::string是C标准库中的一个基本类模板&#xff0c;专门用于处理字符串。它提供了一个可变长度的字符序列&#xff0c;以及一系列用于字符串操作的方法。std::string是值类型&#xff0c;这意味着当它作为函数参数传递或赋值时&#xff0c;整个字符串数据会被复制。 std::st…...

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…...

Java GC 分类,8和9使用的哪种?

Java的垃圾收集器&#xff08;Garbage Collector, GC&#xff09;负责自动管理内存&#xff0c;回收不再使用的对象所占用的空间。随着JVM的发展&#xff0c;出现了多种不同特性的垃圾收集器来适应不同的应用场景和性能需求。在Java 8中&#xff0c;主要有以下几种垃圾收集器&a…...

【Docker从入门到进阶】01.介绍 02.基础使用

1. 介绍 1.1. 什么是 Docker Docker 是一个开源的平台&#xff0c;用于开发、发布和运行应用程序。它使开发者能够以更精简的方式封装应用及其依赖&#xff0c;做到“打包一次&#xff0c;到处运行”。通过 Docker&#xff0c;您可以创建轻量级、可移植的容器&#xff0c;每个…...

GraphRAG-Local-UI - 基于 GraphRAG 支持本地的聊天UI

文章目录 一、关于 GraphRAG-Local-UI &#x1f578;️特点&#x1f31f;&#x1f5fa;️路线图最近更新即将推出的功能 二、&#x1f4e6;安装和设置三、使用入门&#x1f680;1、创建索引目录2、添加示例数据&#xff08;可选&#xff09;3、初始化索引文件夹4、配置设置5、定…...

Java 根据字符生成背景透明的图片

上代码 package com.example.demotest.controller;/*** Author shaolin* Date 2024-10-08 10:11**/import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; impor…...

树莓派3b安装ubuntu18.04服务器系统server配置网线连接

下载ubuntu镜像网址 img镜像&#xff0c;即树莓派官方烧录器使用的镜像网址 ubuntu18.04-server&#xff1a;ARM/RaspberryPi - Ubuntu Wiki 其他版本&#xff1a;Index of /ubuntu/releases 下载后解压即可。 发现使用官方烧录器烧录配置时配置wifi无论如何都不能使用&am…...

【AIGC】2022-NIPS-视频扩散模型

2022-NIPS-Video Diffusion Models 视频扩散模型摘要1. 引言2. 背景3. 视频扩散模型3.1. 重建引导采样以改进条件生成 4. 实验4.1. 无条件视频建模4.2. 视频预测4.3. 文本条件视频生成4.3.1 视频与图像建模的联合训练4.3.2 无分类器指导的效果4.3.3 更长序列的自回归视频扩展 5…...

从零开始构建:Python自定义脚本自动化你的日常任务

从零开始构建&#xff1a;Python自定义脚本自动化你的日常任务 Python 作为一种简洁且功能强大的编程语言&#xff0c;被广泛应用于各种自动化任务中。通过编写 Python 脚本&#xff0c;你可以轻松地将日常重复性工作自动化&#xff0c;例如文件操作、数据处理、网络爬虫、系统…...

【python实操】python小程序之对象的属性操作

引言 python小程序之对象的属性操作 文章目录 引言一、对象的属性操作1.1 题目1.2 代码1.3 代码解释 二、思考2.1 添加属性2.2 获取属性 一、对象的属性操作 1.1 题目 给对象添加属性 1.2 代码 class Cat:# 在缩进中书写⽅法def eat(self):# self 会⾃动出现,暂不管print(f…...

HCIP——网络类型及数据链路层协议

目录 网络类型的分类 数据链路层协议 MA网络 以太网协议 P2P网络 HDLC---高级数据链路控制协议 HDLC网络搭建 PPP---点到点协议 PPP协议的优点 PPP数据帧封装结构​编辑 PPP会话的搭建 路建立阶段---LCP建立 认证阶段 PAP CHAP 网络层协议协商阶段---NCP协商 网…...

数据结构——栈与队列的实现(全码)

一 栈的概念 栈是一种特殊的线性表&#xff0c;栈内数据遵循先进后出(LIFO)的原则&#xff0c;对于栈&#xff0c;只能在同一侧进行入栈和出栈操作。 入栈操作和出栈操作是在栈的同一侧进行的&#xff0c;如图示&#xff1a; 对于栈这种数据类型&#xff0c;我们可以采用链表或…...

MacOS编译和安装Poco库的方法

1.从官网git下载最新的poco源代码 在/usr/local路径下创建Poco文件夹&#xff0c;克隆Poco源代码 sudo git clone -b poco-1.13.3-release https://github.com/pocoproject/poco.git2.等了一会后&#xff0c;报错啦&#xff01;&#xff01;&#xff01; error: RPC failed…...

医院管理新境界:Spring Boot技术突破

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…...

Docker 环境下 MinIO 监控实战:通过 Prometheus 实现集群与桶级别性能监控

Docker 环境下 MinIO 监控实战&#xff1a;通过 Prometheus 实现集群与桶级别性能监控 文章目录 Docker 环境下 MinIO 监控实战&#xff1a;通过 Prometheus 实现集群与桶级别性能监控一 获取 prometheus 配置二 配置的内容三 prometheus 的配置1&#xff09;集群级别的指标2&a…...

渗透测试入门学习——使用python脚本自动跟踪csrf_token实现对网站登录界面的暴力破解

目录 写在前面 使用方法 相关代码 写在前面 最近在学习使用Burp Suite时发现其intruder模块无法实现多种模式的混合使用&#xff0c;就如想要暴力破解账号和口令两个区域并同时跟踪网页的csrf_token时BP似乎不能很方便的实现这一功能&#xff0c;于是自己在练习时就想到了用…...

stc8最小系统使用usb下载程序,关于断电的避坑

首先&#xff0c;按stc官方的原理图做好最小系统。 下面&#xff0c;来看一下stc手册中的操作步骤 USB-ISP 下载程序步骤&#xff1a; 1、按下板子上的 P3.2/INT0 按键&#xff0c;就是 P3.2 接地 2、给目标芯片重新上电&#xff0c;不管之前是否已通电。 电子开关是按下停电后…...

API 数据接口:使用操作流程与安全指南

在当今数字化高速发展的时代&#xff0c;API 数据接口如同构建数字世界的关键纽带&#xff0c;将不同的软件系统和服务紧密连接在一起。无论是企业开发者致力于提升业务效率&#xff0c;还是个人用户追求更便捷的数字体验&#xff0c;深入了解 API 数据接口的使用操作流程以及全…...

elasticsearch 8.2 版本如何设置config/elasticsearch.yml

在Elasticsearch 8.2版本中,`config/elasticsearch.yml`文件是用于配置Elasticsearch的主要配置文件。你可以通过编辑这个文件来设置各种配置选项。以下是一些常见的配置选项及其设置方法: ### 1. 基本配置 #### 集群名称 ```yaml cluster.name: my-cluster ``` #### 节点…...

华为 HCIP-Datacom H12-821 题库 (33)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.VLAN Pool 只要通过一个 SSID 就能够同时支持多个业务 VLAN&#xff0c;从而缩小广播域&#…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...