string类(上)

string类(上)

  • 1.标准库中的string类
  • 2.string类对象的常见构造
    • ①string()
    • ②string(const char* s)
    • ③string(size_t n,char c)
    • ④string(const string&s)
    • ⑤string(const string& str,size_t pos,size_t len=npos)
    • ⑥string(const char* s,size_t n)
  • 3.string类对象的容量操作
    • ①size
    • ②length
    • ③capacity
    • ④empty
    • ⑤clear
    • ⑥reserve
    • ⑦resize

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:标准库中的string;string类对象的常见构造;string类对象的容量操作
⬆⬆⬆⬆上一篇:C++模板初阶
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.标准库中的string类

string是表示字符串的字符串类
string在底层实际是:basic_string模板类的别名,typedef basic_string<char,char_traits,allocator>string
在使用string类时,必须包含#include头文件以及using namespace std;

2.string类对象的常见构造

①string()

构造空的string类对象,即空字符串
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s;
	cout << s << endl;



	return 0;
}

②string(const char* s)

用c-string来构造string类对象
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s << endl;



	return 0;
}

③string(size_t n,char c)

string类对象中包含n个字符c
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s(10,'c');
	cout << s << endl;



	return 0;
}

④string(const string&s)

拷贝构造函数
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s(10,'c');
	string s1(s);
	string s2 = s;
	cout << s << endl;
	cout << s1 << endl;
	cout << s2<< endl;
	return 0;
}

⑤string(const string& str,size_t pos,size_t len=npos)

复制从字符位置pos开始并跨越len字符的str部分(如果str太短或len为string::npos,则复制到str结尾)
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	string s1(s,6,5);
	cout << s1<< endl;
	return 0;
}

在这里插入图片描述
上图是文档中查到的npos,他是一个无符号的unsigned int,值又是-1,所以说它就是无符号整形的最大值,因此,当你参数len作为缺省值或者大于str的长度时,他就是复制到str结尾
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	string s1(s,6);
    cout <<s1 << endl;

	return 0;
}

⑥string(const char* s,size_t n)

从由s指向的字符数组中复制前n个字符
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world",5);
	cout << s << endl;
	return 0;
}

3.string类对象的容量操作

①size

返回字符串有效字符长度
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s.size()<<endl;
	return 0;
}

②length

返回字符串有效字符长度
在这里插入图片描述
和size功能一样,由于历史原因,所以说会有length,但是推荐使用size

③capacity

返回空间总大小
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	cout << s.capacity()<<endl;
	return 0;
}

④empty

检测字符串是否为空串,是返回true,否则返回false
在这里插入图片描述
在这里插入图片描述

⑤clear

清空有效字符
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	 s.clear();
	 cout << s.size() << endl;
	 cout << s.capacity() << endl;
	return 0;
}

可以看出clear只是清空有效字符,但不会缩容

⑥reserve

为字符串预留空间
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	s.reserve(100);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	return 0;
}

可以把空间提前开大,但是打印出来的capacity大小并不是所设置的,这是因为还存在编译器对齐等各种原因,但是无论怎么样,开出的空间肯定大于等于你所设置的参数

⑦resize

将有效字符的个数改成n个,多出的空间用字符c填充
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	s.resize(20,'c');
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
	return 0;
}

注意:
1.size()和length()方法底层实现完全原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是使用size()
2.clear()只是将string中有效字符清空,不改变底层空间大小
3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize是用0来填充多出的元素空间,resize(size_t n,char c)是用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果将元素个数增多,可能会改变底层容量大小,如果是将元素个数减少,底层空间总大小不变
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。知道需要多少空间,提前开空间,减少扩容,提高效率

当resize没给第二个参数时:
在这里插入图片描述
当resize的参数小于字符串有效长度时:
在这里插入图片描述
可以看出resize的参数小于字符串有效字符时,会进行清除字符

🌸🌸string类(上)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【基于协同过滤算法的推荐系统项目实战-2】了解协同过滤推荐系统

本文目录1、推荐系统的关键元素1.1 数据1.2 算法1.3 业务领域1.4 展示信息2、推荐算法的主要分类2.1 基于关联规则的推荐算法基于Apriori的算法基于FP-Growth的算法2.2 基于内容的推荐算法2.3 基于协同过滤的推荐算法3、推荐系统常见的问题1、冷启动2、数据稀疏3、不断变化的用…

java 每日一练 (9)

文章目录1. 单选2. 编程1. 单选 1. 下面程序的输出是:() A &#xff1a; FmNwxy B &#xff1a;fmnwxy C &#xff1a;wxyfmn D &#xff1a; Fmnwxy 答案 &#xff1a; D &#xff0c; 这里主要考察 toUpperCase 和 replace 方法 &#xff0c; 注意点 &#xff1a; toUpperCas…

动态规划-基础(斐波那契数、爬楼梯、使用最小花费爬楼梯、不同路径、不同路径II、整数拆分、不同的二叉搜索树)

动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划问题&#xff0c;五步走&#xff1a;状态定义&am…

【数据结构】双向链表

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; 初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是…

海思SD3403/SS928V100开发(7)mcp2515-SPI转CAN驱动开发

1. 前言 需求: 需要一路can进行收发 分析: 根据目前使用较多的方案是使用主控端SPI接口 接入MCP2515芯片进行CAN协议转换 硬件: MCP2515->SPI2->SS928 2. Uboot开发 2.1 pinmux复用配置 2.1.1 修改uboot参数表 路径: osdrv/tools/pc/uboot_tools/ SS928V100…

Android 进程间通信机制(三) 系统进程与应用进程通信

一. 概述 Android中有一个重要的系统进程(system_server)&#xff0c;运行着系统中非常重要服务(AMS, PMS, WMS等)&#xff0c; 针对Activity而言&#xff0c;系统进程需要不断地调度Activity执行&#xff0c;管理Activity的状态; 每一个APK都需要运行在一个应用进程中&#xf…

【动态规划】最长上升子序列(单调队列、贪心优化)

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

jvm-题库

1、JVM内存模型 JVM内存区域总共分为两种类型 线程私有区域&#xff1a;程序计数器、本地方法栈和虚拟机栈 线程共享区域&#xff1a;堆&#xff08;heap&#xff09;和方法区 特征 线程私有区域&#xff1a;依赖用户的线程创建而创建、销毁而销毁&#xff0c;因用户每次访问都…

带头双向循环链表

在前面我们学习了单链表&#xff0c;发现单链表还是有一些不够方便&#xff0c;比如我们要尾插&#xff0c;需要遍历一遍然后找到它的尾&#xff0c;这样时间复炸度就为O(N),现在我们引入双向带头链表就很方便了&#xff0c;我们先看看它的结构。通过观察&#xff0c;我们发现一…

Vue全新一代状态管理库 Pinia【一篇通】

文章目录前言1. Pinia 是什么&#xff1f;1.1 为什么取名叫 Pinia?1.2. 为什么要使用 Pinia ?2. 安装 Pinia2.1.创建 Store2.1.1. Option 类型 Store2.1.2 Setup 函数类型 Store2.1.3 模板中使用3. State 的使用事项&#xff08;Option Store &#xff09;3.1 读取 State3.2 …

EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)

1、前言 (1)本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法&#xff0c;包含底层时序和读写的代码&#xff1b; (2)大部分代码是EEPROM芯片通用的&#xff0c;但是其中关于某些时间的要求&#xff0c;是和具体芯片相关的&#xff0c;和主控芯片和外设芯片都有关系&…

一天吃透TCP面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

vue模板语法

src目录文件说明&#xff1a; 1&#xff0c;数据绑定{{}} 数据绑定最常见的形式就是使用{{}}&#xff08;双花括号&#xff09;语法的文本插值 在template中使用{{}}文本插值语法中&#xff0c;设置一个变量&#xff0c;再在script中引入data函数&#xff0c;在return中进行数…

接口测试和性能测试有什么区别?我敢打赌你一定不知道

目录 一、什么是接口测试 二、接口测试原理 三、接口测试步骤 四、什么是性能测试 五、性能测试步骤 六、接口测试和性能测试的区别 一、什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点…

2023最全Python+Selenium环境搭建教程-你绝对想不到有这么简单!

还有视频版本结合项目实战介绍&#xff0c;轻松学习&#xff01; PythonSelenium自动化测试环境搭建Web自动化测试全套教程_哔哩哔哩_bilibiliPythonSelenium自动化测试环境搭建Web自动化测试全套教程共计180条视频&#xff0c;包括&#xff1a;1、Web自动化测试需求和挑战、2…

深度学习-Tensorflow使用Keras进行模型训练

本文以FasionMNIST/加州房价数据集为例&#xff0c;介绍KerasAPI进行分类问题/回归问题模型训练的方法Tensorflow版本Tensorflow和keara都需要2.0及以上版本import tensorflow as tf from tensorflow import keras print(tf.__version__) print(keras.__version__)分类MLP构建数…

AI_Papers周刊:第六期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 2023.03.13—2023.03.19 文摘词云 Top Papers Subjects: cs.CL 1.UPRISE: Universal Prompt Retrieval for Improving Zero-Shot Evaluation 标题&#xff1a;UPRISE&#xff1a;改进零样本评估…

要是早看到这篇文章,你起码少走3年弯路,20年老程序员的忠告

文章目录前言一、程序员的薪资是怎么样的&#xff1f;二、我现在的情况适合做程序员吗&#xff1f;三、大学期间到底应该学些什么&#xff1f;四、工作还是考研&#xff1f;五、总结前言 我是龙叔&#xff0c;一名工作了20多年的退休老程序员。 如果你在工作之前看到这篇文章…

【AI大比拼】文心一言 VS ChatGPT-4

摘要&#xff1a;本文将对比分析两款知名的 AI 对话引擎&#xff1a;文心一言和 OpenAI 的 ChatGPT&#xff0c;通过实际案例让大家对这两款对话引擎有更深入的了解&#xff0c;以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们&#xff0c;大家好&#xff01;近年来&…

libcurl库访问人工智能平台之人脸识别

一、前言上一篇文章我们调用libcurl库去访问了百度&#xff0c;访问的是http协议的百度云主页。那么现在我们要基于翔云人工智能平台来实现人脸识别&#xff0c;具体的操作大概就是我们在linux下调用libcurl库去访问翔云人工智能平台&#xff0c;然后实现我们想要的两张人脸图片…