C++入门 string(1)

目录

string类简介

 string类的常用接口说明 

string类对象的常见构造

string类对象的访问及遍历操作 

 operator[ ] 

begin + end

 rbegin + rend


 string类简介

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string string;
  4. 不能操作多字节或者变长字符的序列
  5. 在使用string类时,必须包含#include<string>以及using namespace std;

 string类的常用接口说明 

string类对象的常见构造

C++98定义了多个构造函数,但是我们最常用的只有一下三种: 

(constructor)函数名称功能说明
string() (重点)构造空的string类对象,即空字符串
string(const char* s) (重点)用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string&s) (重点)拷贝构造函数

具体实现方法如下图所示:

#include<iostream>
#include<string>using namespace std;void test_string1()
{// 常用string s1;						// 构造空的string类对象s1string s2("hello world");		// 用C格式字符串构造string类对象s2string s3(s2);					// 拷贝构造s3cin >> s1;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;
}

 其次,string类依然遵守隐式类型转换原则在引用对象时,需要加上const修饰

void push_back(const string& s)
{//.......
}void test_string2()
{string s1 = "hello world";// 隐式类型转换//这里s2引用的是临时变量,临时变量具有常性,需要用const修饰const string& s2 = "hello world";构造//string s3("hello world");//push_back(s1);//以后尾插不用先构造再尾插,直接尾插就可以push_back("hello world");
}

s1这样写也是可以的,C++98为我们写了赋值运算符重载,可以直接使用。


string类对象的访问及遍历操作 

函数名称功能说明
operator[ ](重 点)返回pos位置的字符,const string类对象调用
begin + endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式

 operator[ ] 

string类中operator[ ] 成员函数类似下面代码,引用返回减少一次拷贝构造,也能通过别名修改返回的对象,assert保证了如果传进去的 i 超过了size直接断言报错。

class string
{
public:// 引用返回// 1、减少拷贝// 2、修改返回对象char& operator[](size_t i){assert(i < _size);return _str[i];}
private:char* _str;size_t _size;size_t _capacity;
};

注意:string的类成员对象,如果要统计string变量的大小,要计算类成员变量的内存大小,按照内存对齐原则(32位系统对齐系数是4)即一个string变量大小是12(如图所示的类成员变量总计)而不是算字符串中字符个数,字符的个数与string变量本身内存大小无关

void test_string3()
{string s1("hello world");s1[0] = 'x';	//'h'修改为'x'cout << s1.size() << endl;//cout << s1.length() << endl;//输出11  不包含\0//lenth和size等价,但是为了后续其他数据计算方便,统一写sizefor (size_t i = 0; i < s1.size(); i++){s1[i]++;	//字符串中每个元素+1(ASCII)}// 越界检查  s1[20];	//assert(i < _size);for (size_t i = 0; i < s1.size(); i++){//cout << s1.operator[](i) << " ";   显示调用cout << s1[i] << " ";    //遍历字符串打印每个字符}cout << endl;const string s2("hello world");// 不能修改//s2[0] = 'x';
}

如果string被const修饰,还可以将第一个元素修改为'x'吗?如果不能,为什么呢?看下图:

 s1,s2优先匹配相似度高的函数,即遵循模板参数的匹配原则


begin + end

begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器,begin和end可以实现字符串的遍历

void test_string4()
{string s1("hello world");// 遍历方式1:下标+[]for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;//遍历方式2: 迭代器//auto it1 = s1.begin();   //这样写前提是你知道他是什么类型string::iterator it1 = s1.begin();while (it1 != s1.end()){*it1 += 3;	cout << *it1 << " ";++it1;	//控制it1移动}cout << endl;//遍历方式3: 范围for// 底层角度,他就是迭代器for (auto& e : s1){e++;	//想要修改加上引用cout << e << " ";}cout << endl;
}

这样就有三种方式可以遍历数组, 我们可以将迭代器想象成指针,如下图所示:

 从begin()开始,到end()就停止遍历,可以修改字符串里的值。

void test_string5()
{const string s1("hello world");//string::const_iterator it1 = s1.begin();auto it1 = s1.begin();while (it1 != s1.end()){// 不能修改//*it1 += 3;cout << *it1 << " ";++it1;}
}

 那么加上const修饰应该怎么实现权限的平移呢?另外const_iterator为什么中间要加短下划线?如下图所示:

注意:在编写程序时,const_iterator中间要写下划线 


 rbegin + rend

rbegin记录字符串尾元素,rend记录字符串头元素,两者为反向迭代器,共同使用可以实现数组的逆序访问。

void test_string6()
{const string s1("hello world");//string::const_reverse_iterator cit1 = s1.rbegin();auto cit1 = s1.rbegin();while (cit1 != s1.rend()){// 不能修改//*cit1 += 3;cout << *cit1 << " ";++cit1;}cout << endl;string s2("hello world");string::reverse_iterator it2 = s2.rbegin();//auto it2 = s2.rbegin();while (it2 != s2.rend()){*it2 += 3;cout << *it2 << " ";++it2;}cout << endl;
}

 在图中所示:此处依旧遵循模板参数的匹配原则

此处rbegin从右向左遍历至rend,++往左移动, 编译器实现逻辑如下图所示: 

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

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

相关文章

打造你的博客帝国:DjangoBlog带你飞向国际舞台!

你的网站加载速度还在慢如蜗牛吗&#xff1f;将为你揭开网站速度提升的神秘面纱。从缓存策略到数据库优化&#xff0c;再到高效的代码实践&#xff0c;我们深入探讨了如何让DjangoBlog飞速运行。不仅如此&#xff0c;我们还提供了实用的监控和日志管理技巧&#xff0c;确保你的…

Nginx高级配置及重写功能

文章目录 一、高级配置网页的状态页Nginx第三方模块变量访问日志Nginx压缩功能https功能自定义小图标 二、重写功能&#xff08;rewrite&#xff09;if指令return指令set指令break指令rewrite指令防盗链 一、高级配置 网页的状态页 状态页显示的是整个服务器的状态而非虚拟主…

假设Python脚本包含引用了大量的第三方库,如何打包成.exe文件,并且可以在没有环境的服务器下正常运行

文章目录 1.示例代码说明:2.如何打包注意事项:1.示例代码 以下是一个通常用于数据处理、分析和可视化任务的示例脚本: # 引入第三方库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from scipy import stats from skle…

怎么取消Intellij IDEA中的项目和Git仓库的关联

这篇文章分享一种最简单的方法&#xff0c;取消已经开启代码控制的项目与git代码仓库的关联。 打开项目的位置&#xff0c;然后点击文件管理器上方的查看选项卡&#xff0c;勾选【隐藏的项目】。 删除.git文件夹 然后可以看到项目的文件夹下显示了一个隐藏的.git文件夹&#x…

【Python教程】3-控制流、循环结构与简单字符串操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

武忠祥17堂课没必要全听,这几个才是精华!

作者&#xff1a;Captain 链接&#xff1a;https://www.zhihu.com/question/381665751/answer/3197724055 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 17堂课类似于习题课&#xff0c;是专题训练 17堂课省略了…

SpringMVC[从零开始]

SpringMVC SpringMVC简介 1.1什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M:Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1a;专…

期末测试补题报告

目录 1. 游戏机2. 序列操作3. 划分区间4. 数字匹配5. 地图移动 1. 游戏机 赛时 Accepted 100 \color{green}\texttt{Accepted 100} Accepted 100 题目描述 在一个长条形的区域里有 n n n 个格子&#xff0c;人物角色可以从任意一个格子出生&#xff0c;如果格子上是 L&#…

中介子方程十一

X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXαXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXαXpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαXiXrXkXtXyX$XpXαXpX$XyXtXkXrXiXαX$XiXαXy…

testbench仿真文件编写规则

编写TESTBENCH的目的是为了对使用硬件描述语言设计的电路进行仿真验证,测试设计电路的功能、性能与设计的预期是否相符。编写测试文件的过程如下: (1)产生模拟激励(波形); (2) 将产生的激励加入到被测试模块中并观察其响应; (3) 将输出响应与期望值相比较。 一,各…

李廉洋:6.10黄金原油非农之后,今日行情走势分析策略。

黄金消息面分析&#xff1a;即美联储不会在短期内以降息的方式出手纾困。该报告确实将首次降息的可能性推迟到了12月&#xff0c;但股市的反应不像多数交易商预期的那样。股市非但没有崩盘&#xff0c;反而随着交易员逢低买入而大幅反弹。很明显&#xff0c;市场完全专注于盈利…

Java(十七)---ArrayList的使用

文章目录 前言1.ArrayList的简介2. ArrayList使用2.1.ArrayList的构造2.2.ArrayList的扩容机制(JDK17) 3.ArrayList的常见操作4. ArrayList的具体使用4.1.[杨辉三角](https://leetcode.cn/problems/pascals-triangle/description/)4.2.简单的洗牌游戏 5.ArrayList的问题及思考 …

【数据结构】AVL树(平衡二叉树)

目录 一、AVL树的概念二、AVL树的节点三、AVL树的插入四、AVL树的旋转1.插入在较高左子树的左侧&#xff0c;使用右单旋2.插入在较高右子树的右侧&#xff0c;使用左单旋3.插入较高左子树的右侧&#xff0c;先左单旋再右单旋4.插入较高右子树的左侧&#xff0c;先右单旋再左单旋…

【Python核心数据结构探秘】:元组与字典的完美协奏曲

文章目录 &#x1f680;一、元组⭐1. 元组查询的相关方法❤️2. 坑点&#x1f3ac;3. 修改元组 &#x1f308;二、集合⭐1. 集合踩坑❤️2. 集合特点&#x1f4a5;无序性&#x1f4a5;唯一性 ☔3. 集合&#xff08;交&#xff0c;并&#xff0c;补&#xff09;&#x1f3ac;4. …

Python中的函数装饰器(function decorator)和类装饰器(class decorator)的区别。

在Python中&#xff0c;装饰器&#xff08;Decorators&#xff09;是一种强大的工具&#xff0c;它允许程序员在不修改现有函数或类代码的情况下&#xff0c;为它们添加额外的功能。装饰器本质上是一个接受函数或类作为参数的可调用对象&#xff0c;并返回一个新的函数或类对象…

如何为色盲适配图形用户界面

首发日期 2024-05-25, 以下为原文内容: 答案很简单: 把彩色去掉, 测试. 色盲, 正式名称 色觉异常. 众所周知, 色盲分不清颜色. 如果用户界面设计的不合理, 比如不同项目只使用颜色区分, 而没有形状区分, 那么色盲使用起来就会非常难受, 甚至无法使用. 色盲中最严重的情况称为…

程序员如何高效挖掘市场需求

如何高效发掘市场需求&#xff1f; 那么&#xff0c;我们怎样能够高效地发掘市场的需求呢&#xff1f; 首先&#xff0c;需要指出的是&#xff0c;在挖掘需求时&#xff0c;最好基于个人已有的行业背景或对某个行业的深刻理解来进行。这样做主要有两个原因&#xff1a; 对于…

卡码网用友提前批笔试 | 121 大数减法、122 滑动窗口最大值、117 软件架构

121 大数减法 一开始这么写&#xff0c;但是就是有90%的数据通过不了 #include <iostream> #include <string> using namespace std;void reverse(string& s,int l, int r) {while (l < r) {char c s[l];s[l] s[r];s[r] c;l; r--;} }int main() {strin…

电阻常见失效模式

电阻常见失效模式&#xff1a; 电阻器由于结构较为简单&#xff0c;工艺成熟&#xff0c;通常失效率相对较低。器失效主要表现为以下几种&#xff1a; 阻值漂移&#xff1a;老化后通常发生&#xff1b;&#xff08;通过老化试验进行筛选&#xff0c;规避该问题&#xff09; …

Golang Context详解

文章目录 基本介绍context源码剖析Context接口emptyCtxcancelCtxtimerCtxvalueCtx context使用案例协程取消超时控制数据共享 基本介绍 基本介绍 在Go 1.7版本中引入了上下文&#xff08;context&#xff09;包&#xff0c;用于在并发编程中管理请求范围的数据、控制生命周期、…