【C++】string类(上)

news2024/10/3 2:23:11

文章目录

  • 1.为什么要学习string类
  • 2.标准库中的string类
    • 1.string分类
    • 2.string类对象的常见构造
      • 1.string
    • 3. string类对象的容量操作
      • 1.size
      • 2.capacity
      • 3.reserve
      • 4.resize
        • 扩容+初始化
        • 删除数据
    • 4. string类对象的修改操作
      • 1.push_back
      • 2.append
      • 3.operator+=

1.为什么要学习string类

  • c语言的字符串是以’\0’结尾的一些字符的集合,比如存储你的家庭住址,修改成为新的住址,原来的住址短,现在的住址长,之前的字符串数组存不下,不能很好按需修改
  • c++提供一个类来管理字符串,这个类就叫string

2.标准库中的string类

1.string分类

  • string 是一个类模板,原型是一个 basic_string的类模板由typedef成为string

  • char(重点使用)

  • char:1个字节 ,即一个字符1个字节

  • 宽字符存在(使用相对偏少)
  • wchar_t :2个字节 ,即一个字符2个字节

  • C++11提供u16string和u32string(了解)

  • char16_t:2个字节 即一个字符2个字节


  • char32_t: 4个字节 即一个字符4个字节

  • 上述多种string形式说明有管理不同字符数组的需求
  • ASCII是美国标准信息交换代码,用来在计算机里面存储和显示英文信息,通过26个字母、数字、标点符号,来建立关系形成映射表从而生成了编码表,调用对应的ASCII值来生成对应的符号,ASCII表只有128个字符,一个字节8个bit位就够了
  • 为了支持显示除了英文以外的文字显示,就发明出了unicode (万国码),为每种语言的每个字符设定了统一并且唯一的二进制编码

在这里插入图片描述

  • 使用2个字节进行统一编码
    在这里插入图片描述
  • 使用4个字节进行统一编码
  • UTF-16对应u16string ,UTF-32对应 u32string

2.string类对象的常见构造

  • 必须包含头文件< string >

1.string

  • string()——构造空的string类对象,即空字符串
  • string(const char*s) ——用常量字符串构造string字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1;
    string s2("hello");
    //遍历数组并使每个字符+1
    for (size_t i = 0; i < s2.size();i++)
    {
        s2[i]++;
    }
    cout << s2 << endl;// 通过重载流提取(<<),string可以直接进行打印
    //ifmmp
    return 0;
}
  • string(const string&str,size_t pos,size_t len=npos);—— 拷贝str从pos开始的len个字符
    如果len长度大于pos位置后的字符个数,则有多少取多少
    若len没有给值,则会自动默认缺省值npos
    size_t npos=-1,由于是无符号整形,实际上是-1的补码即整形最大值
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1("hello world");
    string s2(s1, 6, 5);//拷贝s1从第6个位置开始取5个字符
 string s3(s1, 6, 15);//由于pos为指向后取只有5个字符,小于15,有多少取多少
 string s4(s1, 6);//len缺省值为整形最大值,则一直从pos位置取到结尾
cout<<s2<<endl;
cout<<s3<<endl;
cout<<s4<<endl;
}
  • string(size_t n,char c); ——填string类对象前n个字符
int main()
{
    string s(10, '.');// 前10个字符为 .
    cout << s << endl;//..........
    return 0;
}

3. string类对象的容量操作

1.size

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello world");
    cout << s.size() << endl;//11
    cout << s.length() << endl;//11
    return 0;
}
  • size和length两者功能相同,由于string发展历史造成的,最开始字符串的长度为length,后来为了和数据结构其他保持一致使用size更符合,所以推荐使用size

2.capacity

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello world");
    cout << s.size() << endl;//11
    cout << s.capacity() << endl;//15
    return 0;
}
  • 有11个字符,但是空间大小为15(不包含/0)

3.reserve

#include<iostream>
#include<string>
using namespace std;
//扩容问题
int main()
{
    string s;
 //s.reserve(100);//提前开辟100个空间
    size_t sz = s.capacity();//sz代表原来的容量
    cout << "making a grow" << endl;
    for (int i = 0; i < 100; i++)
    {
        s.push_back('c');//不断在字符串后插入字符c
        if (sz != s.capacity())//扩容后,将sz值更新
        {
            sz = s.capacity();
            cout << "capacity changed:" << sz << endl;
        }
    }
}

在这里插入图片描述

  • 提前开辟空间,减少扩容,提高效率

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello");
    s.reserve(100);
    cout << s.size() << endl;//5
    cout << s.capacity() << endl;//111
    return 0;
}
  • reserve只会改变capacity,不会改变size
  • size值没有改变依旧为5,capacity被提前开辟100个空间

4.resize

扩容+初始化

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello");
    s.resize(100);
    cout << s.size() << endl;//100
    cout << s.capacity() << endl;//111
    return 0;
}
  • reserve既改变capacity,也会改变size
  • size值被改变为100,被修改的部分填的是缺省值’\0’,
    capacity值也被改变为111

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello");
    s.resize(10,'x');//将size修改的值填成x

    return 0;
}
  • 可以手动添加字符填成自己想给的值

删除数据

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello");
    s.resize(2);//2<5,所以只保留前2个字符 
    cout << s << endl;//he
        cout << s.capacity() << endl;//15
    return 0;
}
  • 若resize值小于size值,可以删除数据,但不会改变容量

4. string类对象的修改操作

1.push_back

  • 在字符串后插入字符
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello");
    s.push_back(' ');
    s.push_back('!');
    cout << s << endl;//hello !
    return 0;
}

2.append

  • 字符串后插入字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello");
    s.append(" world!");
    cout << s << endl;//hello world!
    return 0;
}

3.operator+=

  • 字符串后插入字符/字符串/对象
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s("hello");
    s += ' ';//字符
    s+='!';
    s += "world";//字符串
    string s2("abc");
    s += s2;//对象
    cout << s << endl;//hello !worldabc
    return 0;
}

相比于push_back 插入字符和append插入字符串,operator+=方式更容易使用

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

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

相关文章

35岁测试工程师,面临中年危机,我该如何自救...

被辞的原因 最近因故来了上海&#xff0c;联系上了一位许久不见的老朋友&#xff0c;老王&#xff1b;老王和我是大学同学&#xff0c;毕业之后他去了上海&#xff0c;我来到广州。因为我们大学专业关系&#xff0c;从12年毕业以后我们从事着相同的职业&#xff0c;软件自动化…

在自己的电脑上使用ChatGPT做一个公网可访问的小应用

文章目录介绍ChatGPT的简单介绍和使用介绍从一个指令开始增加一些样例调整参数创建你自己的应用&#xff08;python&#xff08;Flask版本&#xff09;&#xff09;安装配置环境将你的网站放到公网上总结介绍 本文将会简单介绍一下ChatGPT&#xff0c;并使用ChatGPT做一个简单…

Java字节码深度知多少?

文章目录1、字节码结构1.1、基本结构1.2、实际观测2、内存表示3、方法调用指令4、invokedynamicEND结语Java真的是长盛不衰&#xff0c;拥有顽强的生命力。其中&#xff0c;字节码机制功不可没。字节码&#xff0c;就像是 Linux 的 ELF。有了它&#xff0c;JVM直接摇身一变&…

计算机视觉方向地理空间遥感图像数据集汇总

文章目录1.DSTL卫星图像数据集/Kaggle竞赛2.Swimming Pool and Car Detection/Kaggle竞赛3.SpaceNet Challenge 3数据集4.RarePlanes数据集5.BigEarthNet数据集6.NWPU VHR-10数据集7.UC Merced Land-Use数据集8.Inria Aerial Image Labeling数据集9.RSOD数据集1.DSTL卫星图像数…

项目管理工具dhtmlxGantt甘特图入门教程(九):支持哪些数据格式(上篇)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理控件应用程序的所有需求&#xff0c;是最完善的甘特图图表库这篇文章给大家讲解 dhtmlxGantt 的数据属性和数据库结构。 DhtmlxGantt正版试用下载&#xff08;qun&#xff1a;764…

工厂模式(Factory Pattern)

1.什么是工厂模式 定义一个创建对象的接口&#xff0c;让其子类自己决定实例化哪一个工厂类&#xff0c;工厂模式使其创建过程延迟到子类进行。 2.工厂模式的作用 实现创建者和调用者的分离 3.工厂模式的分类 简单工厂模式工厂方法模式抽象工厂模式 4.工厂模式的优缺点 优…

云原生 -- Docker进阶(Docker-compose,Docker网络简单介绍)

Dockerfile的构建过程 每条保留字段必须为大写字母。Dockerfile每行只支持一条指令&#xff0c;但是每条指令可以带多个参数&#xff0c;并且每条保留字指令后面至少要带有一个参数。从上到下依次执行。每条指令都会创建一个新的镜像层&#xff0c;并提交新的镜像。 大致流程…

CRM系统五大技巧集成Excel为销售流程赋能

销售过程中有很多情况会降低团队的效率。通过正确的实施CRM客户管理系统&#xff0c;可以帮助您的企业自动执行手动任务、减少错误并专注于完成交易。这里有5个技巧&#xff0c;可以帮助您的销售人员通过CRM集成Excel为销售流程赋能并提高他们的整体效率。 技巧1&#xff1a;将…

技术源自洛克希德·马丁,光场XR眼镜FYR解析

专注于医疗场景的一家XR眼镜厂商FYR&#xff08;全称&#xff1a;FYR Medical&#xff09;近期亮相&#xff0c;并宣布完成了260万美元A轮融资&#xff0c;本轮融资由NuVasive领投&#xff0c;资金将用于开发世界上第一个XR光场“放大镜”类产品。据青亭网了解&#xff0c;NuVa…

1、HAL库UART 中断|DMA 自动回显接收数据

1、实现代码&#xff1a; stm32f4xx_hal_conf.h文件开启UART宏定义 #define HAL_UART_MODULE_ENABLED添加stm32f4xx_hal_uart.c和stm32f4xx_hal_dma.c到自己工程&#xff1b; 编写好的代码&#xff1a;usart_Driver.c /***************************************************…

K8s管理应用生命周期-Deployment篇

在k8s中部署应用程序流程 1、使用Deployment部署Java应用 kubectl create deployment web --imageXXX/java-demokubectl get deployment,pods 2、使用Service发布Pod kubectl expose deployment web --port80 --typeNodePort --target-port8080 --namewebkubectl get servic…

深入【虚拟列表】动态高度、缓冲、异步加载... Vue实现

前言&#x1f380; 在前文中我们了解到&#xff1a; 1.在某种特殊场景下&#xff0c;我们需要将 大量数据 使用不分页的方式渲染到列表上&#xff0c;这种列表叫做长列表。 2.因为事件循环的机制&#xff0c;一次性大量的渲染耗时较长&#xff0c;并且渲染期间会阻塞页面交互…

Centos安装OpenResty

文章目录一. OpenResty是什么二. OpenResty的安装1. 安装开发库2. 安装OpenResty仓库3. 安装OpenResty4. 安装opm工具5. 目录结构6. 配置nginx的环境变量7. 启动和运行8. 配置文件修改三. 小案例1. 案例说明2. OpenResty监听请求3. 编写业务代码4. 获取请求参数一. OpenResty是…

深度解析React性能优化API

性能优化一直是前端领域讨论的一个热门问题&#xff0c;但在平时沟通及code review过程中发现很多人对于React中性能优化理解很模糊&#xff0c;讲不清楚组件什么时候更新&#xff0c;为什么会更新&#xff0c;关于React性能优化的文章虽然比较多&#xff0c;但大多数都是在罗列…

【C/C++】内存管理详解

目录内存布局思维导图1.C/C内存分布数据段&#xff1a;栈&#xff1a;代码段&#xff1a;堆:2.C语言中动态内存管理方式3.C内存管理方式3.1new/delete操作内置类型3.2new和delete操作自定义类型4.operator new 与 operator delete函数5.new和delete的实现原理5.1内置类型5.2自定…

ChatGPT is not all you need,一文看尽SOTA生成式AI模型:6大公司9大类别21个模型全回顾(二)

文章目录ChatGPT is not all you need&#xff0c;一文看尽SOTA生成式AI模型&#xff1a;6大公司9大类别21个模型全回顾&#xff08;二&#xff09;Image-to-Text 模型FlamingoVisualGPTText-to-Video 模型PhenakiSoundifyText-to-Audio 模型AudioLMJukeboxWhisperChatGPT is n…

protoc-gen-go的使用和问题

最近 在网上查看关于proto文件编译为golang代码的文章&#xff0c;发现遇到的问题好多都是文件目录不对&#xff0c;参数不对的情况&#xff0c;这里主要解决&#xff0c;使用 不同版本的proto-gen-go 参数不一样和找不到文件问题 安装protoc-gen-go google.golang.org仓库版本…

互联网新时代要来了(二)什么是AIGC?

什么是AIGC&#xff1f; 最近&#xff0c;又火了一个词“**AIGC”**2022年被称为是AIGC元年。那么我们敬请期待&#xff0c;AIGC为我们迎接人工智能的下一个时代。 TIPS:内容来自百度百科、知乎、腾讯、《AIGC白皮书》等网页 什么是AIGC&#xff1f;1.什么是AIGC&#xff1f;…

Vue3篇.01-简介及基本使用,项目创建方式, 模板语法, 事件监听, 修饰符

一.简介1.概念Vue 是一款用于构建用户界面的 JS框架&#xff0c; 基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c; 高效地开发用户界面。渐进式框架&#xff0c; 适应不同需求进行开发。两个核心功能&#xff1a;声明式…

在云原生的趋势下,不掌握Go语言可能不太行

云原生技术已经是不可逆的趋势 云原生技术使组织能够在公共云、私有云和混合云等现代动态环境中构建和运行可扩展的应用程序,其中容器、服务网格、微服务、不可变基础设施和声明式 API 等都是云原生的重要技术内容。 这些新技术的出现使松散耦合的系统具有弹性、可管理和可观…