
【STL】顺序容器之string用法总结
发布日期:2021-05-08 01:38:06
浏览次数:23
分类:精选文章
本文共 1820 字,大约阅读时间需要 6 分钟。
一、基本原理
string类似于vector,内部使用动态数组方式实现。与vector不同,string专门用于存储和操作字符,提供了丰富的字符串操作接口。
vector的工作原理是预留空闲空间,当元素被添加时,只需将新元素复制到预留空间中。当空间不足时,vector会重新申请更大的内存空间,并将现有内容拷贝过去。同样,string也使用了类似的动态内存管理机制,但它专门用于存储字符。
与Java的String类相比,C++的string对象是可修改的,可以随时修改其中的字符内容。这种可修改性使得C++的字符串操作更加灵活。然而,这也意味着在进行频繁的修改操作时,性能可能会受到影响。
二、用法
要使用string类,需要包含头文件:
#include
然后在代码中使用命名空间:
using std::string;
初始化
可以通过多种方式初始化string对象:
- 直接初始化:`string s1;`创建一个空字符串。 - 预定义大小并赋值:`string s1(100, 'a');`创建一个包含100个'a'的字符串。 - 使用字符串字面量:`string s1("abc");`创建一个包含"abc"的字符串。 - 使用初始化列表:`string s1{'a', 'b', 'c'};`创建一个包含字符'a','b','c'的字符串。 - 拷贝初始化:`string s1 = s2;`将s1设置为s2的拷贝。访问元素与获取迭代器
可以通过下标访问元素:
- `s1[n]`或`*iter`访问字符。 - 使用成员函数`at()`:`s1.at(n);`。 - 使用前导和后置迭代器:`s1.front()`, `s1.back()`, `s1.begin()`, `s1.end()`等。添加与删除元素
在尾部添加元素:
- `s1.push_back('a');`在尾部添加一个字符。 - `s1.append("abc");`在尾部添加字符串"abc"。 - `s1.insert(iter, 'a');`在迭代器指向的位置插入字符。删除元素:
- `s1.pop_back();`删除尾部字符。 - `s1.erase(iter);`删除迭代器指向的字符。 - `s1.erase(iter1, iter2);`删除迭代器范围内的字符。 - `s1.clear();`删除所有字符。替换元素
可以通过多种方式替换string内容:
- 全部替换:`s1 = s2;`或`swap(s1, s2);`。 - 部分替换:`s1.replace(pos1, len1, "abc");`替换指定范围内的字符。 - 拷贝初始化:`s1.assign(iter1, iter2);`替换为迭代器范围内的字符。字符串的大小
string有两个大小属性:
- `size()`:表示实际使用的字符数量。 - `capacity()`:表示预留的空闲空间大小。 - `shrink_to_fit()`:尝试减少capacity到与size相同。 - `reserve(n)`:预留至少n个字符的空间。 - `resize(n)`:调整大小到n个字符,若n小于当前size则删除多余字符。子字符串与搜索操作
提取子字符串:
- `s1.substr(pos, n);`从指定位置提取n个字符。字符串搜索:
- `s1.find(args);`查找字符或子字符串的位置。 - `s1.rfind(args);`查找字符或子字符串的最后位置。比较string对象
可以使用比较运算符:
- `==`, `!=`, `<`, `<=`, `>`, `>=`比较字符串的字典序。 - 使用`compare()`方法进行详细比较。数值转换
将字符串转换为数值:
- `stoi(s, p, b)`将字符串转换为整数。 - `stol`, `stoul`, `stoll`, `stoull`转换为长整数。 - `stof`, `stod`, `stodl`转换为浮点数和长双精度数。注意事项
数组越界:访问s1[n]时,如果n超出范围,行为是未定义的。使用`at()`方法会抛出`out_of_range`异常。迭代器失效:向string中添加或删除元素可能导致迭代器失效。请谨慎使用迭代器,避免在容器修改后继续使用。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月30日 13时17分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
windows系统配置自动tomcat
2019-03-17
49数据通路的功能和基本结构
2019-03-17
Java面试宝典(2020版)
2019-03-17
Springboot 初學習
2019-03-17
2020年云南省专升本 - 「计算机」专业各院校招生计划
2019-03-17
Android 四大组件、五大存储、六大布局总结
2019-03-17
打工族有房有车,原来是这么实现的
2019-03-17
算法 顺序查找/折半查找/冒泡排序/选择排序(待改)
2019-03-17
Rancher从入门到精通-2.0 配置gitlab代码库 404页面 原因有点扯
2019-03-17
ProgresSql 连接 ssl off 错误
2019-03-17
浏览器打开winscp 系统错误。代码:5。 拒绝访问。
2019-03-17
Oracle Listener动态注册与静态注册(转载)
2019-03-17
Kubernetes 无法查询到并且无法删除pod实例的排查过程
2019-03-17
android中button修改不了背景颜色
2019-03-17
uniapp自定义弹窗组件|仿微信android/ios弹窗效果
2019-03-17
(网络安全)主动信息收集 操作系统识别
2019-03-17
redis教程-redis环境搭建安装(qq:1197852132)
2019-03-17
github 入门
2019-03-17