C++——String类讲解

一. 为什么学习string类?

    C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。

二. 标准库中的string类

  1. string类对象的常见构造

#include<iostream>
#include<string>
using namespace std;
int main()
{//直接创造一个对象string a;        cout << a << endl;//直接构造string b("hello world");cout << b << endl;//首地址来构造char arr[] = {"abcd"};string c(arr);cout << c << endl;//拷贝构造string d(b);string e = b;cout << d << endl;//将前n个初始化string f(5, 'x');cout << f << endl;
}

 

2. string类对象的容量操作 

 

#include<iostream>
#include<string>
using namespace std;
int main()
{string a("hello world");cout <<"a:"  << a << endl;cout << endl;//输出a占了多少个字节cout <<"size:" << a.size() << endl;cout <<"length:" << a.length() << endl;cout << endl;//输出系统给a一共开了多少空间cout <<"capacity:" << a.capacity() << endl;cout << endl;//将字符串的空间进行调整a.resize(5);cout << "resize之后:" << endl;cout << "a:" << a << endl;cout << "size:" << a.size() << endl;cout << "capacity:" << a.capacity() <<endl;cout << endl;//判断是否为空  1为空,0是不空cout << "empty:" << a.empty() << endl;cout << endl;//清除所有字符a.clear();cout <<"clear:" << a << endl;cout << endl;//判断是否为空  1为空,0是不空cout << "empty:" << a.empty() << endl;cout << endl;//为字符串预留空间cout <<"reserve前的capacity:" << a.capacity() << endl;a.reserve(100);cout <<"reserve后的capacity:" <<a.capacity() << endl;cout << endl;
}

 

注意:

            1 resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。

            2.resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

            3. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。 

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

扩充:auto关键字 

   1.用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

   2.当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

  3.auto不能作为函数的参数,可以做返回值,但是建议谨慎使用 auto不能直接用来声明数组

 auto会自动推导数据的类型,我们也可以看到auto与auto*没有区别。

 

#include<iostream>
using namespace std;
#include<string>
int main()
{string a("hello world");//访问方法:下标访问法cout << a[0] << endl;cout << a[6] << endl;a[0] = 'w';cout << a << endl;//1、下标遍历法cout << "下标遍历法:" << endl;for (int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl;//2、迭代器法(正向)cout << "迭代器法(正向):" << endl;string::iterator it = a.begin();//auto it = a.begin();  与上面的效果一样for (; it != a.end(); it++){cout << *it << " ";}cout << endl;//3、迭代器(反向)cout << "迭代器(反向):" << endl;string::reverse_iterator rit = a.rbegin();//auto it = a.rbegin();  与上面的效果一样while (rit != a.rend()){cout << *rit << " ";rit++;}cout << endl;//范围for法  底层还是迭代器的原理,速度与迭代器相似cout << "范围for法:" << endl;for (auto e : a){cout << e << " ";}cout << endl;return 0;
}

 

 

4. string类对象的修改操作 

 

#include<iostream>
using namespace std;
#include<string>
int main()
{string a("hello world");cout << a << endl;cout << endl;//在末尾加入字符a.push_back('g');cout << "push_back后:" << a << endl;cout << endl;//在末端加入字符串a.append(" world");cout << "append后:" <<a << endl;cout << endl;//在末端随意添加a += "!!!!!";cout << "+=后:" <<a << endl;cout << endl;//返回C格式字符串const char* b= a.c_str();cout << "c_str:" <<b << endl;cout << endl;//从pos位置开始查找字符并返回其位置int npos1 = a.find('o');cout << "find:" <<npos1 << endl;cout << endl;//从pos位置开始从后往前查找字符并返回其位置int npos2 = a.rfind('o');cout << "rfind:" <<npos2 << endl;cout << endl;//从pos位置开始截取n个字符并返回string tmp1 = a.substr(npos1, npos2 - npos1);cout << "substr后tmp1:"<<tmp1 << endl;string tmp2 = a.substr(npos1);cout << "substr后tmp2:" << tmp2 << endl;cout << endl;//从指定的pos位置开始往后找int npos3 = a.find('o',npos1+1);cout << "从指定位置开始从前往后找:" << npos3 << endl;string tmp3 = a.substr(npos3);cout << "substr后tmp3:" << tmp3 << endl;return 0;
}

 5. string类非成员函数 

#include<iostream>
using namespace std;
#include<string>
int main()
{string a("hello ");string b("world");//涉及深层拷贝,不建议多用cout <<"operator+" << operator+(a, b) << endl;cout << "a+b:" << a + b << endl;cout << endl;//输入运算符重载string c;operator>>(cin, c);   //cin>>c;效果相似 录入空格之前的,并在遇到换行时,停止输入cout << "operator>>:" <<c << endl;cout << endl;//输出运算符重载cout << "operator<<:";operator<<(cout, a) << endl;   //cout<<a;效果相似cout << endl;//获取一行字符串cout << "getline:";  //即使是空格之后的也是可以录入的,遇到换行时停止输入string d;getline(cin, d);    //这个在这个程序中测不出来,需要单独测试cout << d << endl;cout << endl;return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

【C语言刷力扣】1768.交替合并字符串

题目&#xff1a; 解题思路&#xff1a; 将 word1 和 word2 元素依次添加至 ans 的后面。 时间复杂度&#xff1a; &#xff0c; n是word1的长度 m是word2的长度 空间复杂度&#xff1a; char* mergeAlternately(char* word1, char* word2) {int len1 strlen(word1);in…

009:屏幕录制软件FastStoneCapture9.5安装教程

摘要&#xff1a;本文详细介绍屏幕录制软件FastStoneCapture9.5的安装流程。 一、软件介绍 FastStone Capture是一款集屏幕捕获、编辑、注释与分享于一体的高性能工具&#xff0c;支持多种截图方式、高质量的图像输出以及便捷的录屏功能&#xff0c;适用于教育培训、工作辅助和…

代码随想录算法训练营第46期Day37,38,39,41

这几天晚上看比赛&#xff0c;就把刷题耽误了。还好是开新章节&#xff0c;前面的题都比较简单。 然后周天做完了又忘记发了 动态规划 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数 Day37前两道题太简单…

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装&#xff1a;便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后&#xff0c;选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…

vue面试题+wx-open-launch-app开放标签唤醒app方法

vue面试题 核心原理部分 mvc mvvm和mvp的区别&#xff1f; MVVM 就是 Model-View-ViewModel 的缩写&#xff0c;MVVM 将视图和业务逻辑分开。 View&#xff1a;视图层&#xff0c;Model 数据模型&#xff0c;而 ViewModel 是把两者建立通信的桥梁。 在 MVVM 框架下&#…

基于Spring Boot的装饰工程管理系统源码(springboot)

项目简介 基于Spring Boot的装饰工程管理系统实现了以下功能&#xff1a; 系统可以实现合同信息管理&#xff0c;合同报价管理&#xff0c;客户管理&#xff0c;立项项目管理&#xff0c;公告信息管理&#xff0c;员工管理&#xff0c;预算报价管理&#xff0c;装饰材料总计划…

react18中的合成事件与浏览器中的原生事件

React 通过将事件 normalize 以让他们在不同浏览器中拥有一致的属性。 合成事件 SyntheticEvent 实例将被传递给你的事件处理函数&#xff0c;它是浏览器的原生事件的跨浏览器包装器。除兼容所有浏览器外&#xff0c;它还拥有和浏览器原生事件相同的接口&#xff0c;包括 stopP…

Postgresql 配置数据库表添加主键自增id

#1024程序员节&#xff5c;征文# 在 PostgreSQL 数据库中&#xff0c;如果你想创建一个自增的 ID 字段&#xff0c;通常会使用序列&#xff08;sequence&#xff09;配合默认值或者使用带有自动递增特性的 SERIAL 类型。以下是两种常见的方法来实现自增 ID&#xff1a; 使用 …

type C 引脚定义

type C 引脚定义 11 22 Type-C接口封装 Type-C接口封装包括&#xff1a;24Pin Type-C、16Pin Type-C、12Pin Type-C、6Pin Type-C Type-C引脚功能

数据结构与算法-21算法专项(中文分词)(END)

中文分词 搜索引擎是如何理解我们的搜索语句的&#xff1f; mysql中使用 【like “%中国%”】&#xff0c;这样的使用方案 缺点1&#xff1a;mysql索引会失效缺点2&#xff1a;不能模糊&#xff0c;比如我搜湖南省 就搜不到湖南相关的 1 trie树 Trie树&#xff0c;又称前缀树…

群控系统服务端开发模式-应用开发-业务架构逻辑开发API准备工作

安装与仓库已经调整完毕&#xff0c;现在开发业务架构逻辑&#xff0c;其次再开发功能逻辑。业务架构逻辑开发与功能逻辑开发不是一回事&#xff0c;一定要明白。业务架构指的是做某一件事或是某一种类型的事的逻辑&#xff0c;在互联网web应用中通常指一套系统的外在逻辑&…

「Qt Widget中文示例指南」如何实现半透明背景?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将为大家展示如…

android openGL ES详解——缓冲区VBO/VAO/EBO/FBO/离屏渲染

目录 一、缓冲区对象概念 二、分类 三、顶点缓冲区对象VBO 1、概念 2、为什么使用VBO 3、如何使用VBO 生成缓冲区对象 绑定缓冲区对象 输入缓冲区数据 更新缓冲区中的数据 删除缓冲区 4、VBO应用 四、顶点数组对象VAO 1、概念 2、为什么使用VAO 3、如何使用VAO…

jupyter notebook改变默认启动路径

安装好Anaconda 3以后&#xff0c;就可以使用Jupyter notebook了&#xff0c;但是我们打开Jupyter notebook后&#xff0c;发现界面是一个默认的目录&#xff0c;这个目录在哪里&#xff1f;如果想把自己写的程序文件保存在自己新建的一个文件夹里&#xff0c;修改默认目录到自…

实现内网穿透的最佳解决方案(无实名认证,完全免费)

目录 ngrok&#xff08;不是很推荐&#xff0c;服务器在国外&#xff0c;已被gfw k了不能用&#xff09; cpolar&#xff08;推荐&#xff0c;无需实名操作简单、服务器在国内&#xff09; SAKURA FRP&#xff08;我的世界玩家中的呼声很高&#xff0c;但要实名认证&#xf…

虚拟光驱软件 PowerISO v8.7.0 中文激活版

PowerISO 是一款虚拟光驱工具及强大的光盘映像文件制作工具。支持创建、编辑、提取、压缩、加密和转换ISO/BIN图像文件。同时自带DISM工具&#xff0c;支持ESD/ISO/WIM/ESD格式转换&#xff0c;制作镜像文件制作U盘启动&#xff0c;支持ISO/BIN/IMG/DAA/WIM等各种常见文件类型。…

C语言初阶:十.结构体基础

♥感谢您阅读本篇文章&#xff0c;文章内容为个人对所学内容的整理总结&#xff0c;欢迎大佬在评论区指点一二。♥ ♥个人主页&#xff1a;折枝寄北-CSDN博客折枝寄北擅长C语言初阶,等方面的知识,折枝寄北关注python,c,java,qt,c语言领域.https://blog.csdn.net/2303_80170533?…

【遗传算法】基于遗传模拟退火算法的风电功率聚类分析

摘要 本文提出了一种基于遗传模拟退火算法的风电功率聚类分析方法。风电功率受气象条件的影响波动较大&#xff0c;给电网调度带来较大挑战。本文通过遗传算法结合模拟退火算法&#xff0c;对风电功率进行聚类分析&#xff0c;旨在挖掘风电功率数据中的模式&#xff0c;提升风…

单管放大电路的分析(Multisim仿真)

绘制原理图 在工作区加入NPN型晶体管 图 1 NPN晶体管 基极电阻R1为50kΩ&#xff0c;集极电阻R2为5 kΩ&#xff0c;直流电源12V&#xff0c;并将电阻与晶体管连接起来。 图 2直流通路 修改晶体管的BF&#xff08;放大倍数&#xff09;为100和VJC&#xff08;等效电阻&#…

coze案例|标准证件照(下)–工作流+Bot设计

项目背景 和 图像流见 教程coze案例|标准证件照(上)–图像流 三、工作流 1、新建工作流 首页“个人空间-工作流-创建工作流” 输入工作流的名称和描述后&#xff0c;点击确认即可。 2、工作流设计 工作流整体流程如下 主要分为以下几个步骤&#xff1a; 开始节点&#…