【C++】“美丽的字符”:string类
目录
为什么学习string类:
什么是string:
标准库中的string类:
auto与范围for:
auto关键字
范围for
vs和g++下string结构的说明:
vs下stirng的结构
g++下string的结构
string的接口:
默认构造:string();
拷贝构造:string (const string&str);
string (size_t n, char c);
string (const string& str, size_t pos, size_t len = npos);
用下标和[]能访问的string,为什么还要学迭代器?
比如在List容器中:
不能用auto的情况:
string常用接口:
reserve():为字符串保留空间,提前预留空间,可以减少因为扩容造成的效率低下 a.如果预留的空间比初始值小,不会有什么(size,capacity都不会变化)变化,但若大,则会进行扩容,但也不会影响到size
reverse():反转
size():返回字符串有效长度(不包括\0)
length():这个不常用,因为历史原因遗留了下来,这个用size()替换
capacity():返回空间总大小→初始空间编译器会给出15,实际是16,因为还有个'\0',不同编译器给出的空间带下不一样
empty():检测字符串是否为空串,若为空,返回true,否则返回false(它只起到检测的作用,不会清理字符串)
claer():清理有效字符
reserve():为字符串预留空间,vs下初始空间为15,如果预留的空间大于原空间则会影响到capacity(),此时编译器会进行扩容,且扩容后的空间会比你预留的空间要大
resize():a.将字符串的有效字符个数修改成n个 , b.如果n大于原capacity,则影响到capacity,会扩容空间,c.若小于原capacity,则不会扩容。d.若n小于原来的size,则会删除数据。e.若n大于size小于capacity,则会在后面差入新的特殊字符,若显示给出了字符,则用显示的字符
reverse():将字符串反转,
push_back():在字符串末尾尾插一个字符
append():在字符串末尾追加一个字符串
operator+=(函数重载):在字符串后追加字符串
size_t find():在str1中查找,字符串c,找到则返回第一个字符出现的位置的下标,没找到则返回npos//从str1中的n位置开始,向后查找字符c,找到返回第一个字符出现的位置的下标,没找到返回npos
const char*c_str():返回值是const char*类型的,返回c格式的字符串,也就是返回存储的字符串的首元素的地址。
substr():从pos位置开始,包括pos位置,向后拷贝len长度的字符。
max_size():返回一个容器所能容纳的最大元素数量的值
compare():比较两个字符串是否相等,返回值是Int
getline():若用cin来输入,则当读取到空格时,就会停止输入,若想要读取这个空格,就可以用getline()
insert():在pos位置之前插入字符或字符串
assign():对字符串赋新值
string类中的swap
编码:
编码表:
表示老美文字的表:
string是一个类,原模版类型叫"basic_string",基础串。
但平时基本上不会使用"basic_string"这个类。
我们使用的是"string"这个类,string是一个第一个模板参数传"char"的"basic_string",它是typedef出来的一个类(日常使用的是这个)
u16string,是一个传16位的char,是两字节。
u32string,是一个传32位的char,是四字节。
为什么学习string类:
在c语言中,字符串是以'\0'结尾的一些字符集合,为了操作方便,c语言提供了一些str系列的库函数,但是这些库函数是于字符串分离开的,不太符合oop思想,而且底层需要用户自己管理,稍不留神可能还会越界访问
什么是string:
string 就是字符串的意思,是 C++用来代替 char 数组 的数据结构。里面封装了一些常用的方法,方便我们对其进行一些操作,而且string的空间大小是动态变化的,大大减小了不必要的花销
string类与char*的区别
-
char* 是一个指针
-
string本质上是一个类,类的内部封装了char*,即string是一个char*型的容器
-
string管理char*所分配的内存,不用担心复制越界和取值越界等
标准库中的string类:
http://www.cplusplus.com/reference/string/string/?kw=string
typedef basic_string string;
string底层本质上还是一个顺序表
既然底层是一个顺序表,那么我们访问string类对象时,就可以使用下标引用操作符来进行访问
string s1("hello world"); cout