【c++】string类 (一)

简介

由于c++的历史包袱,c++要兼容c语言,c++的字符串要兼容c语言,在 C++ 中,字符串通常使用两种主要的方式来表示:

  1. C风格字符串(C-style strings)

    • 依然是以 '\0' 结尾的字符数组。这种表示方式与 C 语言中的字符串相同。例如:
      const char* str = "Hello, World!";
    • 在内存中,它是一个字符数组,最后一个字符是空字符 '\0'
  2. C++ 的标准库字符串(std::string

    • C++ 提供了一个 std::string 类型,属于标准库的一部分。它管理自己的内存,并且不需要手动处理 '\0'。使用 std::string 更加方便和安全。例如:
      #include <string> 
      std::string str = "Hello, World!";
    • std::string 处理字符串的长度、内存分配和释放,因此开发者可以专注于字符串的内容,而不必担心细节。

c风格类型的字符串我们都已经很熟悉,\0的存在让我们在处理在处理字符串的时候需要时刻小心,在手动拼接或复制字符串时经常会因为\0处理不妥而出错。c++为我们提供了一个全新的string来处理字符串的长度、内存分配和释放,因此开发者可以专注于字符串的内容,而不必担心细节。

在一切开始之前,我们先介绍一个网站。www.cplusplus.com是一个广受欢迎的C++编程语言资源网站,成立于2000年代初期。开始由一个c++爱好者建立,后来各路大佬汇聚,网站内容也非常成熟,可供我们学习和参考。

string类的常用接口说明

构造函数 

c++98就为我们提供了7个构造函数,当然并不要求也没有必要对所有的函数烂熟于心,大多数时候把这个当成词典来使用就可以了,选常用的一部分学习。

学习类和对象很容易大家就能知道上面哪是重要的 

不传参的默认构造,拷贝构造和第四个用常量字符串初始化的构造。

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <string>using namespace std;int main()
{string s1;//默认构造string s2("123456789");string s3(s2);//拷贝构造cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cin >> s1;cout << s1 << endl;return 0;
}

我们也可以向里面输入中文

便利string的三种方式

operator[]

string类重载了[],这让我们可以像数组一样访问字符串。

同时注意看,重载后返回的类型是引用,不仅可以减少拷贝,关键在于这样我们能够直接通过下标对字符串进行修改。在重载的时候加入了断言,当pos大于size(越界时),编译器会报错。  

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <string>using namespace std;int main()
{string s1;string s2("123456789");string s3(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s2[2] << endl;//可以通过下标访问s2[0] = '5';//也可以直接修改cout << s2 << endl;/*cin >> s1;cout << s1 << endl;*/return 0;
}

遍历string的第一种方法就是:下标 + []


#include <iostream>
#include <string>using namespace std;int main()
{string s1;string s2("123456789");string s3(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s2[2] << endl;//可以通过下标访问s2[0] = '5';//也可以直接修改cout << s2 << endl;/*cin >> s1;cout << s1 << endl;*/for (size_t i = 0; i < s2.size(); i++){cout << s2[i] << " ";}cout << endl;return 0;
}

迭代器 

迭代器是一种用于遍历容器(如数组、向量、链表等)元素的对象。它提供了一种统一的方法来访问不同类型的容器中的元素(所有的容器都可以由它访问),而无需了解容器的内部结构。

正向迭代器 

begin()返回第一个位置;

end()返回最后一个位置的下一个位置。

for (size_t i = 0; i < s2.size(); i++)
{cout << s2[i] << " ";
}
cout << endl;string::iterator it= s2.begin();
while (it != s2.end())
{cout << *it << " ";++it;
}
cout << endl;

反向迭代器

反向迭代器提供了一个rbegin()指向最后一个位置

 

rend()指向第一个位置的前一个位置。这里任然要使用++,++被重载了让它能倒着遍历。 

string s1;
string s2("123456789");
string s3(s2);cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
string::reverse_iterator it = s2.rbegin();
while (it != s2.rend())
{cout << *it << " ";++it;
}
cout << endl;

const迭代器

由于权限,普通迭代器可读可写,无法访问const对象,const对象要用const迭代器,只读不写。 

const string s2("hello world!");//正向string::const_iterator cit = s2.begin();while (cit != s2.end()){cout << *cit << " ";++cit;}cout << endl;//反向string::const_reverse_iterator rcit = s2.rbegin();while (rcit != s2.rend()){cout << *rcit << " ";++rcit;}cout << endl;

 

 范围for

字符赋值,自动迭代,自动判断结束,底层由迭代器实现。适用于容器和数组。

for (size_t i = 0; i < s2.size(); i++)
{cout << s2[i] << " ";
}
cout << endl;string::iterator it= s2.begin();
while (it != s2.end())
{cout << *it << " ";++it;
}
cout << endl;for (auto ch : s2)
{cout << ch << " ";
}
cout << endl;

但是由于范围for()是给ch这个局部变量赋值,并不能直接改变s2,而迭代器是直接可以改变s2的。

string::iterator it = s2.begin();
while (it != s2.end())
{*it += 2;cout << *it << " ";++it;
}
cout << endl;for (auto ch : s2)
{ch -= 2;cout << ch << " ";
}
cout << endl;cout << s2 << endl;

 

如果要使用范围for()来改变传入的形参,在传入时加上引用,这样就不会生成拷贝而是直接修改传入的形参。 

capacity

 不同编译器对内存空间的处理是不一样的

string s;
size_t sz = s.capacity();cout << "original capacity:" << sz << endl;
for (int i = 0; i < 100; i++)
{s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz << endl;}
}

在vs中有一个buff数组,该开始中string中的数据是储存在buff中的,当要储存的数据空间大于15时才会额外开空间,该开始要把buff中的数据拷贝出来一共开了两倍空间,后边都是开的1.5倍空间。c++只规定了开空间,但是怎么开空间没有做具体的要求。其他的编译器开空间的方式可能会不同。 

频繁的扩容会导致效率低下,为解决这一问题,c++提供了reserve()可以预留空间。

string s("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");cout << s.size() << endl;
cout << s.capacity() << endl << endl;s.reserve(10);
cout << s.size() << endl;
cout << s.capacity() << endl << endl;
s.reserve(30);
cout << s.size() << endl;
cout << s.capacity() << endl << endl;
s.reserve(40);
cout << s.size() << endl;
cout << s.capacity() << endl << endl;
s.reserve(50);
cout << s.size() << endl;
cout << s.capacity() << endl << endl;

 但是c++标准并没有规定具体怎么处理空间,不同的编译器也不一样。

仅仅反转字母

 https://leetcode.cn/problems/reverse-only-letters/

题目解析:

题目中让我们仅仅反转字母,首先我们要分类-----字母和非字母;很简单所有的字母并不多,我们只需要筛选出字母就好,写一个函数实现这个功能 。要实现反转首先就要有两个位置,使用双指针,从首尾开始遍历。基本框架已经确定,接下来就是敲定判断的细节了。首先考虑极限条件,输入的没有字母left会一直加,越界了;所以处理left和right时要加上判断条件。

class Solution {
public:bool Isletter(char ch){if (ch >= 'a' && ch <= 'z'){return true;}if (ch >= 'A' && ch <= 'Z'){return true;}return false;}string reverseOnlyLetters(string s) {if (s.empty()){return s;}size_t left = 0;size_t right = s.size() - 1;while(left < right){while(left < right && !Isletter(s[left])){left++;}while(left < right && !Isletter(s[right])){right--;}swap(s[left++],s[right--]);}return s;}
};

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

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

相关文章

设置服务器走本地代理

勾选&#xff1a; 然后&#xff1a; git clone https://github.com/rofl0r/proxychains-ng.git./configure --prefix/home/wangguisen/usr --sysconfdir/home/wangguisen/etcmakemake install# 在最后配置成本地代理地址 vim /home/wangguisen/etc/proxychains.confsocks4 17…

Web安全 - 文件上传漏洞(File Upload Vulnerability)

文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…

计算机网络:计算机网络体系结构 —— OSI 模型 与 TCP/IP 模型

文章目录 计算机网络体系结构OSI 参考模型TCP/IP 参考模型分层的必要性物理层的主要问题数据链路层的主要问题网络层的主要问题运输层的主要问题应用层的主要问题 分层思想的处理方法发送请求路由器转发接受请求发送响应接收响应 计算机网络体系结构 计算机网络体系结构是指将…

简单部署vue+springboot项目

vue 参考博客 先将vue项目打包 npm run build 再创建项目文件夹front,在front中新建nginx.conf server {listen 80;server_name localhost;# 请求体的大小限制client_max_body_size 50m;# 日志文件存放地址access_log /var/log/nginx/host.access.log main;error…

openpnp - 图像传送方向要在高级校正之前设置好

文章目录 openpnp - 图像传送方向要在高级校正之前设置好笔记图像传送方向的确定END openpnp - 图像传送方向要在高级校正之前设置好 笔记 图像传送方向和JOG面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致&#xff0c;这样才能和贴板子时的实际操作方向对应起来。 …

C++ | Leetcode C++题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution { public:bool find132pattern(vector<int>& nums) {int n nums.size();vector<int> candidate_i {nums[0]};vector<int> candidate_j {nums[0]};for (int k 1; k < n; k) {auto it_i upper_…

测试-BUG篇

文章目录 软件测试的生命周期BUGbug的概念描述bug的要素bug级别bug的生命周期 与开发产生争执怎么办&#xff08;高频考题&#xff09; 软件测试的生命周期 软件测试贯穿于软件的整个生命周期 BUG bug的概念 是指计算机程序中存在的一个错误(error)、缺陷(flaw)、疏忽(mista…

docker环境下配置cerbot获取免费ssl证书并自动续期

文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器&#xff0c;通过容器卷&#xff0c;实现本地html&#xff0c;ssl&#xff0c;conf和ngiinx容器映射的&#xff0c; 经常需要手动部署…

适合跑步的开放式耳机哪个品牌好?怎么选?可入的蓝牙耳机推荐

想必很多爱晨跑的朋友&#xff0c;一定都有过这般令人困扰的经历。耳机戴久了总觉得不舒适&#xff0c;或是尺寸不合&#xff0c;或是材质欠佳&#xff0c;反正无论怎样调整&#xff0c;都很难找到最舒适的佩戴方式。而且&#xff0c;有时候戴的时间久了&#xff0c;还很容易掉…

FLUX的ID保持项目也来了! 字节开源PuLID-FLUX-v0.9.0,开启一致性风格写真新纪元!

之前的文章已经和大家介绍过字节开源的ID保持项目PuLID。随着FLUX模型的发布&#xff0c;PuLID也开源了 FLUX 版本的模型&#xff0c;不得不说FLUX的强大&#xff0c;两个月生态就赶上了SDXL。这次新发布PuLID-FLUX-v0.9.0模型&#xff0c;它为FLUX.1-dev提供了无需调整的ID定制…

4S店4S店客户管理系统小程序(lw+演示+源码+运行)

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。手机具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要求的操作系统是非…

VirtulBOX Ubuntu22安装dpdk23.11

目录 依赖包安装 Python安装 numa安装 ​编辑Python pip3安装 ​编辑pyelftools安装 meson和ninja安装 ​编辑构建与编译 Meson构建DPDK ​编辑Ninja安装DPDK ​编辑VFIO-PCI驱动安装 大页内存和IOMMU配置 ​编辑VFIO-PCI加载 ​编辑VFIO-PCI驱动绑定 ​编辑dpdk…

Linux网络操作命令与函数全面总结

1. 引言 Linux作为服务器和开发平台&#xff0c;网络操作是其核心功能之一。本文旨在全面总结Linux系统中的网络操作方法&#xff0c;包括命令行工具和编程接口&#xff0c;帮助读者深入理解Linux网络管理的机制。 2. 命令行工具 2.1 ping 命令 ping 命令用于测试网络连接和…

【Linux】信号知识三把斧——信号的产生、保存和处理

目录​​​​​​​ 1、关于信号的前置知识 1.1.什么是信号&#xff1f; 1.2.为什么要学习信号&#xff1f; 1.3.如何学习信号&#xff1f; 1.4.一些常见的信号 1.5.信号的处理方式 1.6.为什么每一个进程都可以系统调用&#xff1f; 2.信号的产生 2.1.kill命令产生信号…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…

【C++】二叉搜索树+变身 = AVL树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋&#xff1a;插入新节点后单纯的右边高2.2.2 …

html5 + css3(上)

目录 HTML初识基础认知web标准vscode的简介和使用注释 HTML标签学习排版标签标题和段落换行和水平线标签 文本格式化标签媒体标签图片标签图片-基本使用图片-属性 路径绝对路径相对路径 音频标签视频标签链接标签 HTML基础列表标签列表-无序和有序列表-自定义 表格标签表格-使用…

【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)

将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路&#xff0c;请移步&#xff1a;https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能&#xff1a;可同时绕X轴和Y轴旋转&#xff0c;两者效果会叠加。 完美适配Web、原生…

数据结构与算法篇(图)(持续更新迭代)

目录 一、引言 二、基本概念 三、图的定义 四、图的基本概念和术语 1. 有向图 2. 无向图 3. 简单图 4. 多重图 5. 完全图&#xff08;也称简单完全图&#xff09; 6. 子图 7. 连通、连通图和连通分量 8. 强连通图、强连通分量 9. 生成树、生成森林 10. 顶点的度、…

使用WPF实现一个快速切换JDK版本的客户端工具

发现网上一键切换JDK环境的方法都是在mac或Linux下的&#xff0c;本人主力电脑是Windows&#xff0c;于是看了一下WPF的文档&#xff0c;自己开发了一个客户端。 直接上代码吧&#xff1a; using JavaSwitch.Properties; using Newtonsoft.Json; using System; using System.…