C++ String(1)
String的头文件是#include <string>
String本质上是一个类,是C++实现好的一个类
初学只用学重要的部分,不可能一次性全部学完
1.构造函数
我们先来看它的几个构造函数
首先(1)就是无参的构造
(2)是对str的字符串进行拷贝(拷贝构造)
(4)常量字符串初始化
(6)拷贝n个字符c进行初始化
上面几个是最常用的
下面几个可以了解一下
(5)就是拷贝s字符串的前n个字符进行初始化
(3)从字符串str的pos位置开始的len长度的部分拷贝
这个地方len还有一个缺省值npos,代表size_t的最大值,可以理解成,如果你不给参数,它会读到字符串读完
2.其他函数
operator <<和operator>>
string可以直接进行流插入和流提取,因为这个地方对流插入操作符和流提取操作符进行重载了!
compare()
同样的string也可以直接比较大小,比较方式和C语言的strcmp,但是效率比strcmp高,原因是string类里有compare的字符串大小比较的函数
operator=
同样的,我们对于赋值操作符,string也替我们封装好了
下面是几种常用的赋值
int main(void) {
string s1;
string s2;
s1 = "abc";//(2)
s2 ='a';//(3)
s1 = s2;//(1)
return 0;
}
push_back
那么我们如果要在字符串后面插入怎么办?
string也给我们提供能直接使用的函数
插入一个字符
append()
那如果插入字符串呢?
int main(void) {
string s1;
string s2;
string s3;
s3 = "asas";
s1 = "abc";
s2 ='a';
s1.push_back('a');
s1.append(s3);
return 0;
}
operator+=
当然这两个函数比C语言的函数好的地方在于它会自动扩容,但是如果你觉得这两个函数还是复杂了,有一个更简单的方法,直接+=就可以了
int main(void) {
string s1;
string s2;
string s3;
s3 = "asas";
s1 = "abc";
s2 ='a';
s1 += s2;
s1 += s3;
return 0;
}
这个地方+=本质上和上面两个函数是相同的,只不过我们根据+=类型不同,我们operator+=去调用不同的函数,比如push_back和append
operator []和at
那么如果我们要遍历字符串怎么办呢?我们可以用operator [],这个符号和at是一样的功能,但是遇到错误的时候[]是直接断言,是一种比较暴力的处理,并且断言只有在debug条件下才会报错,at就是抛异常,是一种比较温和的处理方式
[]符号本质上是对数组进行简引用,当然这个函数操作对象的值是可修改的
如果要遍历字符串,那我们怎么知道这个字符串多长呢?
size()和length()
这个时候我们就可以用size函数了,这个size函数的大小是不算字符串最后的\0的和strlen一样
当然length也是一样的,但是size用的更多,推荐使用size
因此我们就可以去遍历打印字符串了
int main(void) {
string s1;
s1 = "asas";
for (int i = 0;i < s1.size();i++)
{
cout << s1[i] << endl;
}
return 0;
}
数组的[]和string的[]底层是不一样的!
int main(void) {
string s1;
s1 = "asas";
char a[3] = {"ab"};
a[1];//本质上是*(a+1)
s1[1];//本质上是s1.operator[](1)
return 0;
}
capacity()
capacity表示的是容量,我们容量不足的时候就会自动扩容,不同编译器下扩容倍数不同
max_size()
max_size返回字符串能达到的最大值,但是这个值在不同编译器结果不一样,实际毫无意义
clear()
clear表示清理数据,clear会改变size的大小,但是不会改变capacity的大小!有析构函数做最后的保底
empty()
empty判断是否为空
3.迭代器
string::iterator it = s1.begin();
while (it != s1.end())
{
cout << *it <<" ";
++it;
}
1.普通顺序迭代器 interator
迭代器包含it begin end
it是当前指向的位置(初始位置为begin)
begin是指向第一个元素
end是指向最后一个元素
但是begin 和end 以及it都是左闭右开
迭代器是像指针一样的类型,可能是指针,可能不是指针!
string平时迭代器用的不多
那么迭代器有哪些优势呢?
2.迭代器的优点
1.范围for的底层是迭代器
不支持迭代器的就不支持范围for
比如说栈,因为要求先进先出,所以不支持迭代器,也不支持范围for
2.任何容器都支持迭代器,且用法相似,迭代器会和容器配合
3.反向迭代器 reverse_iterator
rebegin指向最后一个元素
rend指向第一个元素
rit指向当前位置,(初始位置为最后一个元素)
string::reverse_iterator it = s1.rbegin();
while (it != s1.rend())
{
cout << *it << " ";
++it;
}
当然这个地方用auto也很爽()包括上面的正序也可以
auto it = s1.rbegin();
while (it != s1.rend())
{
cout << *it << " ";
++it;
}
4.const顺序迭代器和const逆序迭代器
对于const对象,我们不能用普通迭代器,就要用const迭代器
同样逆置也有它的const迭代器
void aaa(const string& s1)
{
string::const_iterator it = s1.begin();
//或者auto it=s1.begin();
while (it != s1.end())
{
cout << *it << " ";
++it;
}
auto ot=s1.rbegin();
//或者string::const_reverse_iterator ot = s1.rbegin();
while (ot!=s1.rend())
{
cout << *ot << " ";
++ot;
}
}
int main(void) {
string s1 = "asas";
aaa(s1);
return 0;
}
原文地址:https://blog.csdn.net/Starry_tsx/article/details/143693471
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!