C++ string (浅谈)
浅谈string
<string>
typedef basic_string<char> string;
本篇主要内容是简单地介绍 string类 在竞赛方面较实用的一些功能,可能满足不了各大佬的需求
还是采用查字典的形式,右边目录速览吧
一、迭代器
string
可以被归为顺序容器,有着和其他容器一样的随机访问迭代器
(1)、begin
iterator begin();
返回指向string
的第一个字符的迭代器。
(2)、end
返回一个尾后迭代器,指向尾元素的下一个位置
二、功能型函数
(1)、size
size_t size();
返回字符串的长度,顺便提醒句,以字节为单位
(2)、length
与(1)完全相同
(3)、clear
将当前容器的所有内容清空
(4)、empty
bool empty();
返回当前容器是否为空
三、元素访问
(1)、[]
下标随机访问,它就是神!
简单举例:源字符串每两个字母之间有一个空格,要求只单独输出字母
#include <iostream>
using namespace std;
int main ( void )
{
string a = "a b c d e f";
for ( int i = 0; i < a.size(); i += 2 )
{
cout << a[i];
}
cout << endl;
return 0;
}
看看这优美的下标访问,是不是有种可以立马抛弃传统的char数组的感觉了
(2)、at
和下标访问是一样的,只不过更加安全,如果超出范围,会返回out_of_range
异常
换成at
输出以上程序:
#include <iostream>
using namespace std;
int main ( void )
{
string a = "a b c d e f";
for ( int i = 0; i < a.size(); i += 2 )
{
cout << a.at(i);
}
cout << endl;
return 0;
}
(3)、back
char& back();
返回对最后一个元素的引用,所以我们可以进行输出或重写操作
如果string
为空呢? 那此操作的行为是未定义的,否则不会抛出异常
(4)、front
返回对首元素的引用
四、对string
添加修改的一些操作
(1)、+=
这个就太牛了,可以在当前值的末尾附加其他字符或字符串来扩展字符串
当然这意味着还有两种操作
1、+
s1 + s2
返回s1
和s2
连接后的结果
还有一个,就是字面值也可以与string
对象加起来,注意:一定要保证加号至少连接了一个string
对象
s1 + "hello"
比如说!你不能写成以下这样!
s1 + ( "hello" + ", world" )
2、=
s1 = s2
用s2
的副本代替s1
中原来的字符
(2)、push_back
void push_back (char c);
将c
追加到字符串的末尾,并将其长度自增1
(3)、pop_back
void pop_back();
删除string
中的最后一个字符
如果string
中没有任何元素,则该行为所产生的结果未定义
(4)、insert
啊,到较为复杂的环节了,我尽力弄得清楚点、、
参数类型 | 解释 |
---|---|
pos |
在容器中插入新元素的位置,新元素将插入在position 的前面 (从0开始) |
str |
另一个string 对象 |
subpos |
str 中的起始位置。(从0开始) |
sublen |
要复制的子字符串的长度 |
s |
指向字符数组的指针(例如char数组)。 |
c |
char 类型的值 |
p |
一个指向插入点的迭代器,将新内容插入到p 指向的字符之前。 |
n |
要插入的字符个数 |
first, last |
指定元素范围的迭代器,将 [first,last)范围内的所有元素副本插入到pos 的前面 |
il |
将列表元素{ } 内的值插入到pos 的前面 |
(1)插入str
的所有内容
string& insert (size_t pos, const string &str)
(2)插入str
的子字符串(基于范围)
string& insert (size_t pos, const string &str, size_t subpos, size_t sublen);
(3)插入C风格字符串
string& insert (size_t pos, const char* s);
插入由s
指向的以空字符结束的字符串(C风格的字符串)
(4)插入基于范围的C风格字符串
string& insert (size_t pos, const char* s, size_t n);
(5)插入一段相同的字符
string& insert (size_t pos, size_t n, char c);
或者
void insert (iterator p, size_t n, char c);
插入 n 个字符 c
(6)插入单个字符
iterator insert (iterator p, char c);
(7)迭代器插入
void insert (iterator p, InputIterator first, InputIterator last);
插入[first,last)
所包含的字符
(8)插入元素值列表 { a, b, c, ... }
string& insert (const_iterator p, initializer_list<char> il);
insert,以上
(5)、erase
string& erase (size_t pos = 0, size_t len = npos);
抹去从 pos 开始,跨度为 len 个字节长度,若无参数,则相当于默认参数,等于了执行成员函数clear
iterator erase (const_iterator p);
抹去 p 所指向的字符
iterator erase (const_iterator first, const_iterator last);
抹去由范围迭代器所表示的区域
(6)、swap
void swap (string& str);
交换的是两个容器的内部参数,交换过程非常高效,放心使用
对string
字符串的处理
(1)、c_str
const char* c_str()
返回的是以空字符结束的字符串(C风格的字符串)
这个行为最好将返回值拷贝到一个char数组中,因为如果更改string
,则返回的指针所表示的内容会被破坏
如:strcpy ( str, S.c_str() );
(2)、find
从前往后查找子串或字符出现的位置。
1、size_t find (const string& str, size_t pos = 0)
从下标pos
开始查找str
,返回str
所在的下标位置,找不到的话返回string::npos
2、size_t find (const char* s, size_t pos = 0)
一样一样,换成了C风格字符串
3、size_t find (const char* s, size_t pos, size_t n)
取 s 中的前 n 个字符参与匹配,pos还是那个意思,从下标pos
开始查找str
4、size_t find (char c, size_t pos = 0)
查找单个字符在string
中的位置
(3)、rfind
从后往前查找子串或字符出现的位置。
和find差不多嘛,留坑,等有空更
(4)、substr
string substr (size_t pos = 0, size_t len = npos) const;
返回一个子字符串,子字符串从原字符串下标 pos 取 len 个长度产生的。
(5)、compare
这个挺牛的,有空更,先拿出定义
1、int compare (const string& str) const;
2、int compare (size_t pos, size_t len, const string& str) const;
3、int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
4、int compare (const char* s)
5、int compare (size_t pos, size_t len, const char* s)
6、int compare (size_t pos, size_t len, const char* s, size_t n)
五、成员常量
npos
static const size_t npos = -1;
即size_t
的最大值
作为返回值,通常用于表示没有匹配项。
留在结尾的话
提醒自己:
未更如何构造
未更compare
未更 !=, ==, >, < 操作符的使用规则
未更 find 的其它函数如:find_first_of
引用:
[1]:http://c.biancheng.net/view/400.html
[2]:https://blog.csdn.net/qq_27848347/article/details/91284019
[3]:http://www.cplusplus.com/reference/string/string/?kw=string
推荐[4]:https://www.cnblogs.com/zpcdbky/p/4471454.html
C++ string (浅谈)的更多相关文章
- Java中Integer和String浅谈
Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...
- java - String 浅谈
/** * String s1 = "a"; * 编译器会先检查常量池中是否已经有"a": * 如果没有,则在常量池先创建,后引用. * 如果有,则直接引用; ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- 浅谈C++ STL string容器
浅谈C++ STL string容器 本篇随笔简单讲解一下\(C++STL\)中\(string\)容器的使用方法及技巧. string容器的概念 其实\(string\)并不是\(STL\)的一种容 ...
- 浅谈String、StringBuffer与StringBuilder
浅谈String.StringBuffer与StringBuilder 先详细介绍一下String.StringBuffer与StringBuilder String: 官方对String的说明: ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
随机推荐
- 终于可以愉快的撸Java异步代码了!
异步响应式编程可以极大的提高系统的并发呑吐量,但由于Java没有类似于其他语言的Async/Await机制,所以只能通过CompletableFuture.thenXXX()来串联各个异步任务,这 ...
- 【Oracle】查看哪些用户被授予了DBA权限
查看哪些用户被授予了DBA权限 select * from dba_role_privs where granted_role='DBA'; 回收权限: revoke dba from xxx;
- 攻防世界 - Web(三)
PHP2: 1.进入页面,进行抓包或后台扫描都没有什么发现,然后网上查一波wp,发现是关于.phps文件,进入index.phps,弹出一段代码,查看源代码, <?php if("ad ...
- Unsafe Fileupload - Pikachu
概述: 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像.上传附件等等.当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型.后缀名.大小等等,然后将其按照设计 ...
- 安装macosx10.13high serria
本教程所需资源下载链接: 链接:https://pan.baidu.com/s/1wGTezXz6zGvtlwpv6mMoSg 提取码:r6n9 安装VMware workstation 16.0,安 ...
- 微信登录2-生成授权URL
一.准备工作 1.注册 微信开放平台:https://open.weixin.qq.com 2.邮箱激活 3.完善开发者资料 4.开发者资质认证 准备营业执照,1-2个工作日审批.300元 5.创建网 ...
- ovsdb-client命令
ovsdb-server 的命令行接口. 查看有哪些数据库: ovsdb-client list-dbs [server] 查看数据库 schema: ovsdb-client get-schema ...
- (Oracle)取当前日期的最近工作日
描述:现有一需求,日期表中存放了日期和是否节假日(0-工作日,1-节假日),现在需要取日期表中的最近的工作日.如2017/07/23(周日)最近的工作日应该是2017/07/21(周五). ...
- 非关系型数据库(NOSQL)和关系型数据库(SQL)区别详解
前言: 在我们的日常开发中,关系型数据库和非关系型数据库的使用已经是一个成熟的软件产品开发过程中必不可却的存储数据的工具了.那么用了这么久的关系数据库和非关系型数据库你们都知道他们之间的区别了吗?下面 ...
- BootstrapValidator验证规则、BootStrap表格:列参数
BootstrapValidator验证规则 需引用组件 <script src="~/Scripts/jquery-1.10.2.js"></script> ...