当前位置: 首页 > 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.dtcms.com/a/340009.html

相关文章:

  • 12.3.2设置背景色12.3.3 创建设置类12.4 添加飞船图像 12.4.1 创建Ship 类 12.4.2 在屏幕上绘制飞船
  • 【语法糖】什么是语法糖
  • RK3568 Linux驱动学习——Linux设备树
  • bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(十四)
  • for-else 流程控制结构介绍
  • AVL树、红黑树理解
  • 人脸识别智慧检测算法在人群聚集场景应用
  • 关于less/sass两个css预处理器的总结
  • C++常用容器详解:原理、适用场景与代码示例
  • CentOS上安装Docker的完整流程
  • CSP与XSS
  • web开发,在线%服装商城开发demo,基于html,css,jquery,asp.net,webform,sqlserver数据库
  • CNN-LSTM-Attention、CNN-LSTM、LSTM三模型多变量时序光伏功率预测
  • 深度学习图解:神经网络如何学习?
  • [Linux] 网络中的 `tun` 模式
  • 无人机场景 - 目标检测数据集 - 山林野火烟雾检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • Android13车机系统自定义系统栏显示策略之状态栏下拉异常
  • 决策树算法学习总结
  • 楼宇自控系统的应用,已然成为智能建筑行业发展方向
  • 将字符串“1,2,3“转换为“1‘,‘2‘,‘3‘“
  • Hive常用命令参考
  • 如何保证ES和数据库的数据一致性?
  • java基础(十二)redis 日志机制以及常见问题
  • langChain—状态管理:跟踪复杂任务的上下文流程
  • Linux 进程间通信(IPC):信号、共享内存
  • 内网后渗透攻击--隐藏通信隧道技术(压缩、上传,下载)
  • 19. 大数据-产品概念
  • MySQL 从入门到精通 11:触发器
  • 【群晖NAS】在openwrt上实现内网穿透,并配置外网IP映射(Debian/Ubuntu)
  • 2025-08-19利用opencv检测图片中文字及图片的坐标