C++ String 学习
内容大多来源于C语言中文网 和Xdut博客,我只摘录部分在算法竞赛中使用频率相对较高的内容。
String类:其底层是一种顺序表的结构,元素是char类型的字符.
1.构造函数
string s1—— 构造空的string类对象,即空字符串
string str("ABC")—— 等价于 str="ABC"
string str(strlen,'A')——存储 strlen 个 'A' 到 str 中
string str("ABC",stridx,strlen)—— 等价于 "ABC" 的stridx 位置,作为字符串开头,存到str中,最多存储 strlen 个字节
1 string s1(); // si = "" 2 string s2("Hello"); // s2 = "Hello" 3 string s3(4, 'K'); // s3 = "KKKK" 4 string s4("12345", 1, 3); //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串 5 string s5(s4) //等价于s5 = s4
2. 对 string 对象赋值
可以用 char* 类型的变量、常量,以及 char 类型的变量、常量对 string 对象进行赋值。
string s1; s1 = "Hello"; // s1 = "Hello" s2 = 'K'; // s2 = "K”
string 还有 assign成员函数,其返回对象自身的引用。
str.assign("ABC")——清空字符串,并设置为 "ABC"
str.assign("ABC",2)——清空字符串,并设置为"AB",保留两个字符
str.assign("ABC",1,1)——清空字符串,设置为 "ABC" 中的从 位置1 开始,保留 1个 字符
str.assign(5,'A')——清空字符串,然后字符串设置为 5个 'A'
string s1("12345"), s2; s3.assign(s1); // s3 = s1 s2.assign(s1, 1, 2); // s2 = "23",即 s1 的子串(1, 2) s2.assign(4, 'K'); // s2 = "KKKK" s2.assign("abcde", 2, 3); // s2 = "cde",即 "abcde" 的子串(2, 3)
3. 常用成员函数~
通过str.length() 和 str.size()可以查看字符串长度
str.swap(str1) 交换 str1 和 str 的字符串
str.push_back('A') 在str末尾添加一个字符 'A' ,参数必须是字符形式
str.append("ABC") 在str末尾添加一个字符串 "ABC",参数必须是字符串形式,并返回对象自身的引用。
1 string s1("123"), s2("abc"); 2 s1.append(s2); // s1 = "123abc" 3 s1.append(s2, 1, 2); // s1 = "123abcbc" 4 s1.append(3, 'K'); // s1 = "123abcbcKKK" 5 s1.append("ABCDE", 2, 3); // s1 = "123abcbcKKKCDE",添加 "ABCDE" 的子串(2, 3) 6 s1.length() //3 7 s1.push_back('A') // s1 = "123abcbcKKKA"
4.插入字符串
insert 成员函数可以在 string 对象中插入另一个字符串,返回值为对象自身的引用。
str.insert(2,3,'A')——在str下标为2的位置添加 3个 字符'A'
str.insert(2,"ABC")——在str下标为2的位置添加 字符串 "ABC"
str.insert(2,"ABC",1)——在str下标为2的位置添加 字符串 "ABC" 中 1个 字符
str.insert(2,"ABC",1,1)——在str下标为2的位置添加 字符串 "ABC" 中从位置 1 开始的 1 个字符
1 string s1("Limitless"), s2("00"); 2 s1.insert(2, "123"); //在下标 2 处插入字符串"123",s1 = "Li123mitless" 3 s1.insert(3, s2); //在下标 2 处插入 s2 , s1 = "Li10023mitless" 4 s1.insert(3, 5, 'X'); //在下标 3 处插入 5 个 'X',s1 = "Li1XXXXX0023mitless"
5.删除和替换字符串
replace 成员函数可以对 string 对象中的子串进行替换,返回值为对象自身的引用。
string s1("Real Steel"); s1.replace(1, 3, "123456", 2, 4); //用 "123456" 的子串(2,4) 替换 s1 的子串(1,3) cout << s1 << endl; //输出 R3456 Steel string s2("Harry Potter"); s2.replace(2, 3, 5, '0'); //用 5 个 '0' 替换子串(2,3) cout << s2 << endl; //输出 HaOOOOO Potter int n = s2.find("OOOOO"); //查找子串 "00000" 的位置,n=2 s2.replace(n, 5, "XXX"); //将子串(n,5)替换为"XXX" cout << s2 < < endl; //输出 HaXXX Potter
erase 成员函数可以删除 string 对象中的子串,返回值为对象自身的引用。
string s1("Real Steel"); s1.erase(1, 3); //删除子串(1, 3),此后 s1 = "R Steel" s1.erase(5); //删除下标5及其后面的所有字符,此后 s1 = "R Ste"
6.String的比较
除了可以用 <、<=、==、!=、>=、> 运算符比较 string 对象外,string 类还有 compare 成员函数,可用于比较字符串。compare 成员函数有以下返回值:
- 小于 0 表示当前的字符串小;
- 等于 0 表示两个字符串相等;
- 大于 0 表示另一个字符串小。
string s1("hello"), s2("hello, world"); //compare返回值为int值 int n = s1.compare(s2); //比较s1的子串 (1,2) 和s2的子串 (0,3) n = s1.compare(1, 2, s2, 0, 3); // 比较s1的子串 (0,2) 和 s2 n = s1.compare(0, 2, s2); //比较s1与字符串"Hello" n = s1.compare("Hello"); //比较 s1 的子串(1,2)和"Hello” n = s1.compare(1, 2, "Hello"); //比较 s1 的子串(1,2)和 "Hello" 的子串(1,2) n = s1.compare(1, 2, "Hello", 1, 2);
7.查找字符和子串
查找成功返回位置 ,查找失败,返回-1
find函数:从头查找
- str.find('A')——查找 'A'
- str.find("ABC")——查找 "ABC"
- str.find('B',1)——从 位置1 处,查找'B'
- str.find("ABC",1,2)——从 位置1 处,开始查找 'ABC' 的前 2个 字符
rfind函数:从尾部查找
- str.rfind('A')——查找 'A'
- str.rfind("ABC")——查找 "ABC"
- str.rfind('B',1)——从 位置1 处,向前查找'B'
- str.rfind("ABC",1,2)——从 位置1 处,开始向前查找 'ABC' 的前 2个 字符
find_first_of()函数: 查找是否包含有子串中任何一个字符
- str.find_first_of("abBc")——查找 "abBc" 和str 相等的任何字符,"abBc" 中有就返回位置
- str.find_first_of("abBc",1)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始查找"abBc" 中的字符,"abBc" 中有的就返回位置
- str.find_first_of("abBc",1,2)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始查找"abBc" 的前 2个 字符,"abBc" 中有的就返回位置
find_last_of()函数:find_first_not_of ()末尾查找, 从末尾处开始,向前查找是否包含有子串中任何一个字符
- str.find_last_of("abBc")——查找 "abBc" 和str 相等的任何字符,向前查找,"abBc" 中有的返回位置
- str.find_last_of("abBc",1)——查找 "abBc" 和str 相等的任何字符,从 位置1 处,开始向前查找"abBc" 中的字符,"abBc" 中有的就返回位置
- str.find_last_of("abBc",10,2)——查找 "abBc" 和str 相等的任何字符,从 位置10 处,开始向前查找"abBc" 的前 2个 字符,"abBc" 中有的就返回位置
当然还有非常厉害的正则表达式匹配法。。。但在算法竞赛中这些功能速度较慢,在有些情况下会超时。
8.求 string 对象的子串
str1=str.substr(2) 提取子串,提取出 str 的 下标为2 到末尾,给 str1
str1=str.substr(2,3) 提取子串,提取出 str 的 下标为2 开始,提取三个字节,给 str1
string s1 = "this is ok"; string s2 = s1.substr(2, 4); // s2 = "is i" s2 = s1.substr(2); // s2 = "is is ok"
要记住substr的参数不是 L和R而是 L, length.效果是 取出[L,L + length)的子串
常用算法
reverse(str.begin(),str.end()) 可以将str反转
原文地址:https://www.cnblogs.com/LYFer233/p/12581441.html
- demo1 动态显示view或弹框 动态隐藏view或弹框
- 从零开始的Spring Security Oauth2(一)
- 细说Android事件传递
- swift基础_ set get方法 理解
- 高仿今日头条(2)
- ios tableview 上加 textfiled
- Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)
- 仿淘宝购买详情页购买缩小动画
- 高仿今日头条(1)
- android Native堆
- Spring Boot中Web应用的统一异常处理
- android bitmap的内存分配和优化
- Gitflow工作流程
- Android学习第一弹:Android通过用代码画虚线椭圆边框背景来学习一下shape的用法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- golang--连接redis数据库并进行增删查改
- golang--redis连接池
- springboot配置之使用application.properties时编码问题
- mybatis动态sql之foreach补充(二)
- golang数据结构之稀疏数组
- mybatis扩展之使用PageHelper插件进行分页(是真好用)
- 动态规划--0,1背包问题(再也不怕类似背包问题了)
- springboot配置之Profile多环境支持
- LeetCode | 102.二叉树的层次遍历
- golang数据结构之队列
- 动态规划--最长上升子序列(LIS)的长度
- golang数据结构之环形队列
- golang数据结构之单链表
- golang数据结构之双链表
- golang数据结构之循环链表