常用接口
reverse resize size
size&lenght
这两个接口功能相同,又有size又有lenght的主要原因是,在大佬实现完length的时候,发现为了stl的一致性应该有个统一的名字来命名接口,但是二叉树又没办法使用lenght来表达(毕竟二叉树他也没长度一说,所以就有出现了个size).
我们先来看看string的size.返回的值类似于strlen();也就是不算字符串的长度.length()返回的值也同理.
capacity
用来查看string容量的大小
直接看看代码就可以理解:
注:我们的string的容量是自动扩容的.
reserve&&resize
用于手动扩容,但是这两个还是有所差距的.
reserve
单纯用于开辟一片你指定的空间大小(不一定完全相同,因为存在对齐等问题)
resize
帮你开辟完空间后还会把size指定在你所指定的位置上,如上例resize后的size就是1000;
我们还可以通过传一个字符将resize后size前的数值初始化成我们串的字符样子.
如下:
如果是在resize之前就有元素在的情况呢?
如下:
如果我们想重新把size变成另一个小一些或者大一些的值的时候我们也可以使用resize;
如下:
符号重载
[]
这个符号重载,其实是模仿着这我们的普通字符串的,我们可以通过[]来直接访问对应下标的元素,也可以将对应下标的元素进行更改.可以说和我们的字符串一模一样.
我们在使用string的[]的时候其实是更改成函数operator[](size_t Off)
文档介绍如下:
可以看到我们函数重载的返回值是char& 也就是引用,这个其实也是有原因的
为了省去拷贝.
我们需要对pos位置的值进行更改我们就必须返回引用值&不然我们无法更改.
其实有着类似功能的还有at()这个公共函数
at这个其实功能和[]几乎就是一样的要说哪里不一样其实也就只有在你越界时报错方式不同了.
我们来看看报错问题
我们的[]使用的是assert断言的方式来进行报错处理的.
而我们的at()函数是通过抛异常来解决越界问题的.
我们只需要接收此异常就不会发生报错了.
如下图:
at其实可以看作之前版本的[].我们在使用的时候也多用[]不用at了.
operator=
这三个赋值几乎包含了所有的字符类。所以我们可以给直接给string类传递字符类型的所有形式。
包括单个字符。
如下:
注意这里的'a'的类型是const char这个接口是我们C++11增加的接口,上述代码在不支持的C++11的部分就无法运行。
如Linux的g++就会报以下错误。
不过鉴于我们是初学者,我们先不接触C++11在后面我们会进行专门的讲解。
+=operator
先来看看文档的介绍吧
ok,我们可以看到他有三个重载(在C++98中),那我们也就可以使用这三种重载.
分别使用效果如下
string s; s += "qwe"; for (size_t i = 0; i < s.size(); i++) { cout << s[i] << " "; } cout << endl; s += 'a'; for (size_t i = 0; i < s.size(); i++) { cout << s[i] << " "; } cout << endl; string s2 = "zxc"; s += s2; for (size_t i = 0; i < s.size(); i++) { cout << s[i] << " "; } cout << endl;
可以看出+=的作用其实就是在我们的string后插入字符或字符串(也有两个接口是专门用来后插入字符或者字符串的但是在string中我们还是使用+=较好).