C++ STL -->string类

news2024/9/29 7:50:29

文章目录

  • STL
    • 什么是STL
  • String类
    • string类对象的构造方式
    • string类对象的容量操作
    • string类对象的访问及遍历操作
      • string迭代器函数遍历类对象
    • stirng类对象的修改操作
    • string类非成员函数

STL

什么是STL

STL全称standard template libaray-标准模板库 是C++标准库的重要组成部分 不仅是一个可复用的组件库 更是一个保罗数据结构与算法的软件框架
STL是C++中的优秀的作品 有了它 许多底层数据结构以及算法都不需要自己重新造轮子 直接站在巨人的肩膀上 健步如飞快速进行开发

String类

标准库中的string类string类的文档介绍

string类对象的构造方式

string类实现了多个构造函数的重载 常用的构造函数有:
在这里插入图片描述
示例:

string s1();//构造空的string类对象 即空字符串s1
string s2("Hello stirg"); //用常量字符串构造string类对象s2
string s3(10, 'x');//用10个x构造string类对象s3
string s4(s2);//用s2 拷贝构造s4

string类对象的容量操作

在这里插入图片描述

  1. size函数:返回字符串有效字符长度 不算\0
// size_t size() const; 函数接口
string s2("Hello string");
cout << s2.size() << endl;//12
  1. length函数:和size函数一样 返回字符串有效的字符长度
    两者没区别引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()。
//size_t length() const;函数接口
string s2("Hello string");
cout << s2.length() << endl; //12
  1. max_size: 返回字符串的最大容量(没发现有什么用)
//size_t max_size() const; 函数接口
  1. resize: 改变当前对象的有效字符个数
//void resize (size_t n); 函数接口
//void resize (size_t n, char c); 函数接口
string s2("Hello string");
cout << s2.size() << endl;//12

s2.resize(20);
cout << s2.size() << endl;//20
cout << s2 << endl; //Hello string

string s3("Hello string");
s3.resize(20, 'x');
cout << s3.size() << endl; //20
cout << s3 << endl; //Hello stringxxxxxxxx

string s4("Hello string");
s4.resize(2);
cout << s4.size() << endl; //2
cout << s4 << endl; //He

【resize规则】:

  • 当n大于当前对象的size时 将size扩大到n 若未指定字符 默认为’\0’
  • 当n小于当前对象的size时 将size缩小到n
  1. capacity:返回总空间的大小
//size_t capacity() const; 函数接口
string s5("Hello string");
cout << s5.capacity() << endl; //15
  1. reserve: 改变对象容量的大小
//void reserve (size_t n = 0); 函数接口
string s5("Hello string");
cout << s5.capacity() << endl;//15

s5.reserve(50);
cout << s5.capacity() << endl;//63

s5.reserve(10);
cout << s5.capacity() << endl;//63

【reserve规则】:

  • 当n大于当前对象的capacity时 将capacity扩大到n或大于n(不同的编译器实现的不一样)
  • 当n小于当前对象的capacity时 什么也不做
  1. clear:清空有效字符
//void clear(); 函数接口
string s6("Hello string");
s6.clear();
cout << s6 << endl;//什么都不打印 已经清空了

clear()只是将string中有效字符清空,不改变底层空间大小。
8. empty: 检测字符串是否为空串 是返回true 否返回false

//bool empty() const; 函数接口
string s7("Hello string");
cout << s7.empty() << endl;//0

string s8("");
cout << s8.empty() << endl; //1

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

image.png

  1. operator[]返回pos位置的字符(pos为下标)
//char& operator[] (size_t pos); 函数接口
//const char& operator[] (size_t pos) const; 函数接口 
string s9("Hello string");
cout << s9[0] << endl; //H
cout << s9[1] << endl; //e
s9[0] = 'X';
cout << s9 << endl; //Xello string
  1. at与操作符[]功能一样 区别在于一个是操作符重载 一个是成员函数
//char& at (size_t pos); 函数接口
//const char& at (size_t pos) const;  函数接口
string s10("Hello string");
cout << s10.at(0) << endl; //H
s10.at(0) = 'X'; 
cout << s10 << endl;//Xello string
  1. back和front

返回字符串的尾部和头部位置的字符

//char& back();函数接口
//const char& back() const;函数接口
//char& front();函数接口
//const char& front() const; 函数接口
string s11("Hello string");
s11.back() = '!';
s11.front() = 'X';
cout << s11 << endl;//Xello strin!

string迭代器函数遍历类对象

image.png

  1. begin和endbegin获取第一个字符的迭代器 end获取最后一个字符的下一个位置的迭代器 一般用来遍历对象
//iterator begin(); 函数接口
//const_iterator begin() const; 函数接口
//iterator end(); 函数接口
//const_iterator end() const; 函数接口
string s12("Hello string");
//返回值是一个迭代器类型 用法和指针有点类似
string::iterator  it = s12.begin();
while (it != s12.end())
{
        cout << *it;
        it++;
}//Hello string
  1. rebegin和rendrbegin获取最后一个字符的下一个位置的迭代器 rend获取第一个字符的迭代器 一般用来逆向遍历
//reverse_iterator rbegin(); 函数接口
//const_reverse_iterator rbegin() const; 函数接口
//reverse_iterator rend(); 函数接口
//const_reverse_iterator rend() const; 函数接口
string s13("Hello string");
auto rit = s13.rbegin();

while (rit != s13.rend())
{
        cout << *rit;
        ++rit;
}//gnirts olleH

剩下的用处很少 就不介绍了

stirng类对象的修改操作

image.png

  1. operator+= 在字符串后面追加字符串str
//string& operator+= (const string& str); 函数接口
//string& operator+= (const char* s); 函数接口
//string& operator+= (char c); 函数接口
string s14("Hello string");
string s15("!");
s14 += s15;
cout << s14 << endl; //Hello string!
s14 += "!!!";
cout << s14 << endl; //Hello string!!!!
s14 += '!';
cout << s14 << endl; //Hello string!!!!!
  1. append 在字符串后面追加字符串
//string& append (const string& str);   函数接口
//string& append (const char* s);   函数接口
//string& append (size_t n, char c); 函数接口
string s16("Hello string");
string s17("!!!");
s16.append(s17);
cout << s16 << endl;//Hello string!!!
s16.append("!!!"); 
cout << s16 << endl;//Hello string!!!!!!
s16.append(10,'x'); 
cout << s16 << endl;//Hello string!!!!!!xxxxxxxxxx
  1. push_back:在字符串后面尾插字符c
//void push_back (char c); 函数接口
string s18("Hello stirng");
s18.push_back('!');
s18.push_back('!');
s18.push_back('!');
cout << s18 << endl;// Hello stirng!!!

4.assign:分配一个新的字符串替换当前内容

//string& assign (const string& str); 函数接口
//string& assign (const char* s); 函数接口
//string& assign (size_t n, char c); 函数接口

string s19("Hello");
string s20("string");
s19.assign(s20);
cout << s19 << endl;//string
s19.assign("XXXXX");
cout << s19 << endl; //XXXXX
s19.assign(10, '!');
cout << s19 << endl;//!!!!!!!!!!
  1. insert在指定的位置后面插入字符串
//string& insert (size_t pos, const string& str);  函数接口
//string& insert (size_t pos, const char* s);  函数接口
//iterator insert (iterator p, char c); 函数接口
string s21("H");
s21.insert(1, "e");//He
s21.insert(2, "llo"); //Hello
s21.insert(s21.end(), '!');//Hello!

6.erase删除指定位置的字符

//string& erase (size_t pos = 0, size_t len = npos);   函数接口
//iterator erase (iterator p);   函数接口
//iterator erase (iterator first, iterator last); 函数接口
string s22("Hello string");
s22.erase(6, 7);
cout << s22 << endl; //Hello
s22.erase(s22.begin());
cout << s22 << endl; //ello
s22.erase(s22.begin(),s22.end());
cout << s22 << endl;//空

7.replace替换字符串的一部分

//string& replace (size_t pos, size_t len, const char* s);  函数接口
//string& replace (size_t pos, size_t len, size_t n, char c); 函数接口
string s22("Hello string");
s22.replace(6, 7,"juejing");
cout << s22 << endl;//Hello juejing
s22.replace(6, 7, 8, 'x');
cout << s22 << endl;//Hello xxxxxxxx

8.swap交换两个string类对象

//void swap (string& str); 函数接口
string s23("hello");
string s24("string");
s23.swap(s24);
cout << s23 << endl; //string
cout << s24 << endl; //hello

string类非成员函数

image.png

  1. operator+:连接字符串
//string operator+ (const string& lhs, const string& rhs); 函数接口string类+string类
//string operator+ (const string& lhs, const char*   rhs);函数接口 string类+字符串
//string operator+ (const char*   lhs, const string& rhs);函数接口 字符串+string类
//string operator+ (const string& lhs, char          rhs);函数接口 string类+字符
//string operator+ (char          lhs, const string& rhs);函数接口 字符+string类
string s24("Hello ");
string s25("string");
cout << (s24 + s25) << endl;//Hello string
cout << (s24 + "string") << endl;//Hello string
cout << ("Hello " + s25) << endl;//Hello string
cout << (s24 + '!') << endl; //Hello !
cout << ('!' + s25) << endl; //!string

【建议】:尽量少用 传值返回 深拷贝 效率太低

  1. relational operator 大小比较
    函数接口:
    image.png
    用法与内置类型一样
string s24("Hello ");
string s25("string");
if (s24 > s25)
{
        cout << "s24 > s25" << endl;
}
else
{
        cout << "s24 < s25" << endl;//执行此分支
}

3.swap:交换两个string类对象
之前的swap是string类的成员函数 这个swap是非成员函数

//void swap (string& x, string& y); 函数接口
string s26("Hello string");
string s27("Hello world");
swap(s26, s27);
cout << s26 << endl;//Hello world
cout << s27 << endl;//Hello string

4.operator>> 和 operator<<:流插入和流提取操作符重载

//istream& operator>> (istream& is, string& str); 函数接口
//ostream& operator<< (ostream& os, const string& str); 函数接口
string s28;
cin >> s28;//输入
cout << s28 << endl;

5.getline获取一行字符串

//istream& getline (istream& is, string& str, char delim); 从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。
//istream& getline (istream& is, string& str);从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。
string s29;
getline(cin,s29,'D'); //输入ABCDEF
cout << s29;//输出ABC

string s30;
getline(cin, s30);//输出Hello string
cout << s30; //输出Hello string

【注意】:使用>>进行输入时 当读取到空格时就会停止读取 所以不能使用>>将带有空格的字符串读到string类对象中 使用getline函数就可以解决这一问题

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

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

相关文章

【EI会议征稿】第四届公共管理与智能社会国际学术会议(PMIS 2024)

第四届公共管理与智能社会国际学术会议&#xff08;PMIS 2024) 2024 4th International Conference on Public Management and Intelligent Society 第四届公共管理与智能社会国际学术会议将在2024年3月15-17日在长沙召开。PMIS 2024由中南大学社会计算研究中心、中南大学公共…

Linux操作系统使用及C高级编程-D11-D13结构体

由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员”&#xff0c;其描述了一块内存空间的大小及解释意义。 语法&#xff1a; struct 结构体名 { 结构体成员列表 }; 下图是struct的定义和使用方法&#xff0c;其中20行这种赋值方式错误&#xf…

c# 文件读取和写入

文件写入 using System.Collections.Generic; namespace demo1;/// <summary> /// System.IO下的所有的Stream类是所有数据流的基类 /// 流是用于传输数据的对象&#xff0c;流就是用来传输数据的 /// 数据传输的两种方式&#xff1a;1、数据从外部源传输到程序中&#…

微服务实战系列之加密RSA

前言 在这个时代&#xff0c;我们选择的人生目标已丰富多彩&#xff0c;秉持的人生态度也千差万别&#xff1a; 除了吃喝玩乐&#xff0c;还有科技探索&#xff1b; 除了CityWalk&#xff0c;还有“BookWalk”&#xff1b; 除了走遍中国&#xff0c;还有走遍世界&#xff1b; …

Me-and-My-Girlfriend-1

Me-and-My-Girlfriend-1 一、主机发现和端口扫描 主机发现&#xff0c;靶机地址192.168.80.147 arp-scan -l端口扫描&#xff0c;开放了22、80端口 nmap -A -p- -sV 192.168.80.147二、信息收集 访问80端口 路径扫描 dirsearch -u "http://192.168.80.147/" -e * …

Linux进程通信——消息队列

概念 消息队列&#xff0c;是消息的链接表&#xff0c;存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 特点 1.消息队列是面向记录的&#xff0c;其中的消息具有特定的格式以及特定的优先级。&#xff08;消息队列是结构体&#xff09; 2.消息队列独立于发送与接…

企业app软件定制开发的重点是什么?|小程序网站搭建

企业app软件定制开发的重点是什么&#xff1f;|小程序网站搭建 在当今数字化时代&#xff0c;企业对于信息技术的依赖越来越大。为了适应市场需求并提高内部运营效率&#xff0c;许多企业开始寻求定制开发企业app软件。这种定制开发可以根据企业的具体需求和业务流程进行个性化…

MySQL InnoDB 引擎底层解析(二)

6.2.InnoDB 的表空间 表空间是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个页的池…

数据库基础入门 — SQL

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

n-皇后问题(DFS回溯)

n−皇后问题是指将 n 个皇后放在 nn的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n。 输出…

Python的安装及其python程序生成exe可执行程序

Python是一种高级编程语言&#xff0c;由Guido van Rossum在1989年12月首次发布。它具有简单易学、易读、易写的语法和强大的动态类型和垃圾回收机制。Python解释器是自由且开放源代码的软件&#xff0c;可以在各种操作系统&#xff08;如Linux、Windows、macOS等&#xff09;上…

SSM框架(一):Spring 容器

文章目录 一、Spring Framework系统框架二、IoC控制反转 与 DI依赖注入 简单入门三、Bean3.1 Bean的配置3.2 实例化Bean的四种方式3.3 Bean的生命周期 四、依赖注入4.1 setter注入4.2 构造器注入4.3 注入方式选择4.4 依赖自动装配4.5 集合注入4.6 案例&#xff1a;配置数据库4.…

软件设计中如何画各类图之一实体关系图(ER图):数据库设计与分析的核心工具

目录 1 前言2 符号及作用&#xff1a;3 绘制清晰的ER图步骤4 实体关系图的用途5 使用场景6 实际应用场景举例7 结语 1 前言 当谈到数据库设计与分析的核心工具时&#xff0c;实体关系图&#xff08;ER图&#xff09;无疑是其中最重要的一环。在软件开发、信息管理以及数据库设…

Android codec2 视频框架之输出端的内存管理

文章目录 前言setSurfacestart从哪个pool中申请buffer解码后框架的处理流程renderOutbuffer 输出显示 前言 输出buffer整体的管理流程主要可以分为三个部分&#xff1a; MediaCodc 和 应用之间的交互 包括设置Surface、解码输出回调到MediaCodec。将输出buffer render或者rele…

可用于短期风速预测及光伏预测的LSTM/ELM预测程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序内容&#xff1a; 该程序是预测类的基础性代码&#xff0c;程序对河北某地区的气象数据进行详细统计&#xff0c;程序最终得到pm2.5的预测结果&#xff0c;通过更改数据很容易得到风速预测结果。程序主要…

U盘系统制作

一、简介 目标&#xff1a;将Linux和Windows系统装进U盘&#xff0c;linux称为LTG、Windows称为WTG 环境&#xff1a; 1、使用Rufus工具进行操作 2、基于windows系统进行Rufus软件进行制作 3、使用联想Y7000作为测试U盘系统启动测试机器&#xff08;无系统盘&#xff09; 优点…

CAD文件转奥维 转shapefile

之前写过一篇CAD转ArcGIS 其实万变不离其宗&#xff0c;都是经纬度知识的应用。 背景是当我们拿到一份带有坐标的CAD文件如何转换为矢量文件。 首先我们要明白XY坐标系的含义。 X—real X-500000 为近距离标准经线的距离。 y 为距离赤道的距离。 X 429174.3048 Y 32313…

Java 多线程之 volatile(可见性/重排序)

文章目录 一、概述二、使用方法三、测试程序3.1 验证可见性的示例3.2 验证指令重排序的示例 一、概述 在Java中&#xff0c;volatile 关键字用于修饰变量&#xff0c;其作用是确保多个线程之间对该变量的可见性和禁止指令重排序优化。 当一个变量被声明为volatile时&#xff0…

暴力求解欲哭无泪之保安问题

身为程序员哪一个瞬间让你最奔溃&#xff1f; > 提醒&#xff1a;在发布作品前&#xff0c;请把不需要的内容删掉。 方向一&#xff1a;身为程序员遇到过的奔溃瞬间 写题目想到第一个方法便是暴力求解,然后少情况 题目如下: 方向二&#xff1a;如何解决遇到的奔溃瞬间 不…