当前位置: 首页 > news >正文

STL——string的使用(快速入门详细)

目录

前言

一、基本知识

二、常用接口使用

2.1常见构造

2.2容量操作

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

2.3string类对象的修改操作

总结


前言

本篇文章目的是为了快速掌握string的使用,这里对常用的进行演示助于理解,其它的也会给出。

一、基本知识

1、如果要使用string类,那么必须包含头文件以及using namespace std;

2、该接口与常规的容器基本相同,再添加了一些专门用来操作的string的常规操作

3、string是表示字符串的字符串类

4、不能操作多字节或者边长字符的序列

5、string在底层实际是:basic_string模版类的别名

二、常用接口使用

2.1常见构造

函数名称功能说明
string() (重点)构造空的string类对象,即空字符串
string(const char* s) (重点)用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string&s) (重点)拷贝构造函数

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

复制从字符位置 pos 开始并跨越 len 字符的 str 部分(如果 str 太短或 len 是 string::npos,则复制到 str 的末尾)。

//无参构造
string s1;
//常量字符串初始化
string s2("李白");
string s3("hello world");//n个字符进行初始化,10个*
string  s4(10, '*');
//拷贝构造
string s5(s2);string s6(s3, 6, 5);//从s3的第6个开始,往后复制5个有效字符给s6
string s7(s3, 6);//从s3里复制前6个字符给s7

2.2容量操作

函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
max_size返回字符串的最大长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符

reserve (重点)

void reserve (size_t n = 0);

为字符串预留空间,如果 n 大于当前字符串容量,则该函数会导致容器将其容量增加到 n 个字符(或更大)。

resize (重点)

void resize (size_t n);
void resize (size_t n, char c);

将有效字符的个数改成n个,多出的空间用字符c填充;

#include<string>
#include<iostream>
using namespace std;
int main()
{string s1("hello world");cout << s1.size() << endl;//有效字符,不算\0cout << s1.length() << endl;//有效字符,不算\0cout << s1.capacity() << endl;//容量cout << s1.max_size() << endl;//最大容量cout << s1.empty() << endl;//是否为空return 0;
}

std::string.capacity( )此容量不一定等于字符串长度。它可以等于或更大,额外的空间允许对象在向字符串添加新字符时优化其作,而且不同的平台在不一样。

#include<string>
#include<iostream>
using namespace std;
int main()
{string s1("hello world");cout << s1.capacity() << endl;s1.reserve(20);//扩容cout << s1.capacity() << endl;s1.resize(5);//有效字符设为5cout << s1 << endl;s1.resize(10, 'x');//有效字符设为10,多的部分初始化字符'x'cout << s1 << endl;return 0;
}

string的扩容机制每个平台也是不一样的,如果是用linux的话,会是准确的。

注意:

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

2. clear()只是将string中有效字符清空,不改变底层空间大小。

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

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

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

函数名称功能说明
operator[] (重点)返回pos位置的字符,const string类对象调用

at

返回pos位置的字符,const string类对象调用
backC++11返回最后一个字符
frontC++11返回第一个字符
begin+ endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围for(方便)C++11支持更简洁的范围for的新遍历方式
#include<string>
#include<iostream>
using namespace std;
int main()
{string s1("hello world");cout << s1[0] << endl;//访问下标为0的字符cout << s1.at(0) << endl;//访问下标为0的字符cout << s1.front() << endl;//访问头字符cout << s1.back() << endl;//访问尾字符for (auto x : s1)//语法糖,范围for{cout << x;}cout << endl;string::iterator it= s1.begin();//正向迭代器while (it != s1.end()){cout << *it;it++;}cout << endl;string::reverse_iterator il = s1.rbegin();//反向迭代器while (il != s1.rend()){cout << *il;il++;}cout << endl;return 0;
}

1.范围for,不能倒着遍历,只有正着遍历,范围for底层就是替换为迭代器。

2.迭代器是通用的,任何容器都支持迭代器,一通百通,并且用法类似,iterator提供了一种统一的方式访问和修改容器的数据。

2.3string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+= (重点)在字符串后追加字符串str
assign原来的字符串数据不要了,重新给数据,用的较少
replace替换字符

erase

string& erase (size_t pos = 0, size_t len = npos);

iterator erase (iterator p);

iterator erase (iterator first, iterator last);

从字符串中删除,从pos开始,删除len个

或者迭代器删除

c_str(重点)返回C格式字符串
find + npos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回
#include<string>
#include<iostream>
using namespace std;
int main()
{string s1("hello world");s1.push_back('s');s1.append(" world");s1 += '*';s1 += "www";cout << s1 << endl;s1.assign("hello world");//清除原有数据,载入新的数据cout << s1 << endl;s1.replace(6, 5, "11111111");//下标从6开始,后面的5个字符替换成strcout << s1 << endl;cout << s1.c_str() << endl;s1.erase(0,5);//下标从0开始,删除5个cout << s1 << endl;cout << s1.substr(0, 5)<< endl;//下标从0开始,截取字符串中的5个s1.erase(0);//下标从0开始,后面全部删除cout << s1 << endl;return 0;
}

将协议 域名 资源名分离:

#include<string>
#include<iostream>
using namespace std;
int main()
{//将协议 域名 资源名分离string url("https://legacy.cplusplus.com/reference/string/string");size_t pos1 = url.find("://");//如果找到了返回第一个字符的位置,没找到返回nposstring protocol;if (pos1 != string::npos){protocol = url.substr(0, pos1);}cout << protocol << endl;string domain;string uri;size_t pos2 = url.find("/",pos1+3);if (pos2 != string::npos){domain = url.substr(pos1+3, pos2-(pos1+3));uri = url.substr(pos2 + 1);}cout << domain << endl;cout << uri << endl;return 0;
}

2.4非成员函数

函数功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较

其它的可以在这里查看:string - C++ Referencehttps://legacy.cplusplus.com/reference/string/string/?kw=string


总结

本文简单的介绍string,方便使用,快速入手。

http://www.xdnf.cn/news/1326367.html

相关文章:

  • 可靠性测试:软件稳定性的守护者
  • Flink Stream API - 源码二开详细实现
  • 低延迟、跨平台与可控性:直播SDK的模块化价值解析
  • 基于 PyTorch 模型训练优化、FastAPI 跨域配置与 Vue 响应式交互的手写数字识别
  • 微服务架构的演进:从 Spring Cloud Netflix 到云原生新生态
  • 如何在 uBlock Origin 中忽略指定网站的某一个拦截规则
  • 数字孪生 :提高制造生产力的智能方法
  • 当宠物机器人装上「第六感」:Deepoc 具身智能如何重构宠物机器人照看逻辑
  • 常见的软件图片缩放,算法如何选择?
  • 当机器猫遇上具身智能:一款能读懂宠物心思的AI守护者
  • ISIS高级特性
  • 驱动开发系列66 - glCompileShader实现 - GLSL中添加内置函数
  • MySQL练习题50题(附带详细教程)
  • 【GNSS定位原理及算法杂记5】​​​​PPK(后处理动态定位)深度解析:后处理的艺术与 RTK 的互补
  • ListBoxes使得在专为灵活性和易用性设计
  • GaussDB 中 alter default privileges 的使用示例
  • 从数据表到退磁:Ansys Maxwell中N48磁体磁化指南
  • GaussDB 八种常规锁介绍
  • MoonBit Perals Vol.06: Moonbit 与 LLVM 共舞 (上):编译前端实现
  • CloudDM 新增支持 GaussDB 与 openGauss:国产数据库管理更高效
  • wx小游戏canvas能力封装
  • 推理还是训练 || KV缓存和CoT技术
  • 云原生堡垒机渗透测试场景
  • 应急响应常见命令
  • 代码随想录刷题——字符串篇(七)
  • ChatBI驱动的智能商业决策:奥威BI的深度实践
  • Java多线程:线程创建、安全、同步与线程池
  • 常见的 Bash 命令及简单脚本
  • C语言实战:从零开始编写一个通用配置文件解析器
  • SpringAI——向量存储(vector store)