C++ STL -->string类

文章目录

  • 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.mfbz.cn/a/172508.html

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

相关文章

枚举 小蓝的漆房

题目 思路 核心思想是枚举 首先利用set记录每一种颜色 然后依次从set取出一种颜色作为targetColor&#xff0c;遍历房子 如果当前房子的颜色和targetColor不相同&#xff0c;就以当前房子为起点&#xff0c;往后长度为k的区间都涂成targetColor&#xff0c;并且需要的天数递增…

华为云cce健康检查有什么用?配置需要注意什么?

华为云cce健康检查 如上图&#xff0c;华为云健康检查可用来探测cce的实例运行状态&#xff0c;必要时cce会自动重启实例&#xff0c;达到cce持续服务。 但是配置时需要注意一下几个方面&#xff0c;否则cce的状态总是有些不正常。 1、http探查比较友好。因为我们的在cce里面…

深入理解强化学习——马尔可夫决策过程:马尔可夫决策过程和马尔可夫过程/马尔可夫奖励过程的区别

分类目录&#xff1a;《深入理解强化学习》总目录 《深入理解强化学习——马尔可夫决策过程》系列前面的文章讨论到的马尔可夫过程和马尔可夫奖励过程都是自发改变的随机过程&#xff0c;而如果有一个外界的“刺激”来共同改变这个随机过程&#xff0c;就有了马尔可夫决策过程&…

【ctfshow】web入门-信息搜集-web11~20

【ctfshow】web入门-信息搜集-web11~17 web11_域名其实也可以隐藏信息&#xff0c;比如flag.ctfshow.com 就隐藏了一条信息web12_有时候网站上的公开信息&#xff0c;就是管理员常用密码web13_技术文档里面不要出现敏感信息&#xff0c;部署到生产环境后及时修改默认密码web14_…

构建和应用卡尔曼滤波器 (KF)--扩展卡尔曼滤波器 (EKF)

作为一名数据科学家&#xff0c;我们偶尔会遇到需要对趋势进行建模以预测未来值的情况。虽然人们倾向于关注基于统计或机器学习的算法&#xff0c;但我在这里提出一个不同的选择&#xff1a;卡尔曼滤波器&#xff08;KF&#xff09;。 1960 年代初期&#xff0c;Rudolf E. Kal…

低代码服务商,中小型数字化软件服务商的新出路

数字化时代大背景下&#xff0c;企业信息化向数字化转型成为所有企业发展的必由之路&#xff0c;企业在对业务模式、流程、组织形式、信息技术等方面进行重新定义时&#xff0c;软件必然参与价值创造的全过程&#xff0c;这势必驱使软件成为推动数字化转型的“引擎”&#xff0…

Motion Plan之搜索算法笔记

背景&#xff1a; 16-18年做过一阵子无人驾驶&#xff0c;那时候痴迷于移动规划&#xff1b;然而当时可学习的资料非常少&#xff0c;网上的论文也不算太多。基本就是Darpa的几十篇无人越野几次比赛的文章&#xff0c;基本没有成系统的文章和代码讲解实现。所以对移动规划的认…

React结合antd5实现整个表格编辑

通过react hooks 结合antd的table实现整个表格新增编辑。 引入组件依赖 import React, { useState } from react; import { Table, InputNumber, Button, Space, Input } from antd;定义数据 const originData [{ key: 1, name: 白银会员, value: 0, equity: 0, reward: 0…

PHP中isset() empty() is_null()的区别

在PHP中&#xff0c;isset()、empty()和is_null()是用于检查变量状态的三个不同的函数。它们分别用于检查变量是否已设置、是否为空以及是否为null。在本文中&#xff0c;我们将详细解释这三个函数的用法、区别和适当的使用场景。 isset(): isset()函数用于检查一个变量是否已…

MSTP配置示例

多生成树可以实现链路的防环、冗余备份、负载均衡功能 拓朴如下&#xff1a; 主要配置如下&#xff1a; [R1] interface GigabitEthernet0/0/1ip address 10.1.1.254 255.255.255.0 # interface GigabitEthernet0/0/2ip address 10.2.2.254 255.255.255.0 #[S1] interface …

如何利用CHATGPT写主题文章

问CHAT&#xff1a;新课标下畅言智慧课堂助力小学生量感培养&#xff0c;拟解决的关键问题 CHAT回复&#xff1a; 1. 确定智慧课堂在新课标下的正确应用方法&#xff1a;新课标对教育方法、内容等提出了新的要求&#xff0c;需要探讨如何将智慧课堂与新课标相结合&#xff0c;…

学习Rust适合写什么练手项目?【云驻共创】

Rust是一门备受关注的系统级编程语言&#xff0c;因其出色的内存安全性、高性能和并发性能而备受赞誉。对于那些希望学习和掌握Rust编程语言的人来说&#xff0c;练手项目是一个不可或缺的环节。通过实际动手完成项目&#xff0c;你可以加深对Rust语言特性和最佳实践的理解&…

JOSEF约瑟 数显电压继电器 HYJY-30-02 AC220V 导轨安装

HYJY系列电压继电器 HYJY-30-01集成电路电压继电器 HYJY-30-01A HYJY-30-01B HYJY-30-02集成电路电压继电器 HYJY-30-02A HYJY-30-02B HYJY-30-03-3集成电路电压继电器 HYJY-30-03-2 HYJY-30-03-1 HYJY-30-02电压继电器&#xff08;以下简称继电器&#xff09;用于发…

go语言学习之旅之Go 语言指针

学无止境&#xff0c;今天继续学习go语言的基础内容 Go语言支持指针&#xff0c;允许你在程序中直接操作变量的内存地址。指针存储了变量的内存地址&#xff0c;通过指针&#xff0c;你可以直接访问或修改该地址上的值。 学习过c语言的一定知道指针 定义指针 在Go语言中&…

基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码

基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于非洲秃鹫优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

leetcode刷题日记:205. Isomorphic Strings(同构字符串)

205. Isomorphic Strings(同构字符串) 对于同构字符串来说也就是对于字符串s与字符串t&#xff0c;对于 s [ i ] s[i] s[i]可以映射到 t [ i ] t[i] t[i],同时对于任意 s [ k ] s [ i ] s[k]s[i] s[k]s[i]都有 s [ k ] s[k] s[k]映射到 t [ k ] t[k] t[k],则 t [ k ] t [ i …

(swjtu西南交大)数据库实验(概念数据库设计及逻辑关系转换):音乐软件数据管理系统

一、实体型及属性 &#xff08;20分&#xff09; 用户&#xff08;账号&#xff0c;用户名&#xff0c;密码&#xff0c;性别&#xff0c;生日&#xff0c;地区&#xff0c;手机号&#xff0c;个性签名&#xff0c;信息修改审核客服&#xff09; 歌手&#xff08;歌手号&#…

Linux内核mmap内存映射详解及例子实现

mmap在linux哪里&#xff1f; 什么是mmap&#xff1f; 上图说了&#xff0c;mmap是操作这些设备的一种方法&#xff0c;所谓操作设备&#xff0c;比如IO端口&#xff08;点亮一个LED&#xff09;、LCD控制器、磁盘控制器&#xff0c;实际上就是往设备的物理地址读写数据。 但…

猫罐头牌子哪个好一点?精选5款口碑好的猫罐头推荐!

猫罐头牌子哪个好一点&#xff1f;选择猫罐头是十分重要的事情&#xff0c;千万不能将就。因为&#xff0c;好的猫罐头不仅可以营养丰富&#xff0c;水分充足&#xff0c;适口性好&#xff0c;还能易吸收。而一旦选择错误&#xff0c;不仅无法达到上述效果&#xff0c;还可能产…

深度学习之基于YoloV5抽烟检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于YOLOv5&#xff08;You Only Look Once&#xff09;的抽烟检测系统可以用于实时检测图像或视频中是否存在抽烟行…
最新文章