从零开学C++:string类

2024-08-28 20:36
文章标签 c++ string 开学

本文主要是介绍从零开学C++:string类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言:现在我们将正式踏入C++起飞阶段C++语言自带的各种类能极大地简化我们所编写的代码的量,而我们今天要学的string就是其中之一。

更多有关C++的知识点详解可前往个人主页:计信猫​​​​​

一,认识string

        string其实很简单,我们可以简单地把它看成如下的代码实现的类:

class string
{char* _str;//存储字符串size_t _size = 0;//记录字符串的有效字符的个数size_t _capacity = 0;//记录string的空间大小
};

         所以显而易见,当我们想要储存一个字符串的时候,我们就可以使用string类来储存这个字符串,但前提是我们需要包含<string>的头文件。

 二,string类对象的常见构造方式

1,string()

        该方法构造的其实就是以空字符串来构造一个string类的对象。

2,string(const char* s)

        有了这个方式,所以我们就可以字符串的首元素的地址传给string,然后构造string类的对象,具体的方式如下:

int main()
{const char* str = "hello";string s1(str);string s2("hehe");return 0;
}

3,string(size_t n,char c)

        这样的string类的构造方式比较少见,它的意思是使用n个字符c来构成一个字符串,再以该字符串构造string类的对象

int main()
{string s3(3, 'h');//以字符串"hhh"来构造s3return 0;
}

 4,string(string const& s)

        该方式我们就见怪不怪了,这里就是利用了我们的拷贝构造函数来对我们的对象进行构造

int main()
{string s3(3, 'h');//以字符串"hhh"来构造s3string s4(s3);//使用拷贝构造函数构造s4return 0;
}

三,string类对象的容量的操作

1,size和capacity

        当我们想要知道我们的string类对象的有效字符个数的大小时,我们就可以使用size,使用方式如下:

int main()
{string s1("hhh");int count = s1.size();//获取了s1中有效字符的个数return 0;
}

        而与之相同的,当我们想要知道s1的空间总大小的时候,我们就可以使用s1.capacity()来获取s1的总空间大小

2,empty

        empty意为空的,所以如果对象中字符串为空,则该函数会返回true,反之则会返回false

3,clear

        clear意为清除,当我们使用clear函数时,那么此时对象当中的字符串就会被完全清除size会变为0,但是我们的空间总大小capacity并不会改变

4,reserve

        reserve函数会为string预留出空间的大小,相当于就是改变capacity的值,并且为string开出对应capacity的空间大小,但当我们reserve的值小于我们原本的capacity时,reserve不会改变容量大小

        所以我们可以理解为reserve只可以扩容,不可以缩容

int main()
{string s1("hhh");s1.reserve(10);//将s1的总空间大小变为10return 0;
}

5,resize

        resize可以改变string中有效字符的个数,我们将其分为两个部分来讲。

Ⅰ,将size变大

        那么此时我们就有两种方式:resize(size_t n)resize(size_t n, char c),两者都可以将stringsize变为n,但不一样的是,前者是使用‘0’来填充,而后者是使用字符c来进行填充。

Ⅱ,将size变小

        当我们想要将size变小时,那就意味着原来的字符串会被删除一部分,而我们的底层总空间capacity并不会改变。

四,string类对象的访问和遍历

1,operator[]

        在string类对象当中,我们就可以使用下标对字符串中某个特定位置的字符进行访问,我们就可以理解为将一个字符串拆开,然后一个一个地存放在字符数组当中了。

int main()
{string s1("hhh");char c = s1[1];//使用下标对s1进行访问return 0;
}

2,迭代器begin+end

        迭代器是我们新学的内容,在初级阶段我们就可以将它理解为一个指针begin指向字符串的首元素地址,而end指向字符串结尾的下一个地址。那么我们使用迭代器进行string类对象的遍历代码如下:

int main()
{string s1("hello world");string::iterator it = s1.begin();//创建一个迭代器it来遍历s1while (it != s1.end()){cout << *it;//打印it++;}return 0;
}

         那么代码一走,结果如下:

3,范围for

        范围for也是一种遍历string的方法,它的底层逻辑其实也就是迭代器,所以,只要可以使用迭代器的地方,就可以使用范围for来遍历。而范围for的遍历方式如下:

int main()
{string s1("hello world");for (auto ch : s1){cout << ch;}return 0;
}

        其中auto的含义为自动,那么此时auto就会根据给ch赋值的变量的类型来自动变为对应的类型

五,string类对象的修改操作

1,push_back

        push_back函数的作用很简单,但也非常地常用,它可以在原string字符串的末尾再插入一个字符,试例如下:

int main()
{string s1("hello world");s1.push_back('a');//在字符串末尾添加一个字符afor (auto ch : s1)//使用范围for进行打印{cout << ch;}return 0;
}

        代码一走,结果如下:

2,append

        append跟前面所学的push_back很相似,两者都是在字符串末尾进行添加,但是append则专门针对于字符串的添加,而不是单个字符的添加。

3,operator+=

        operator+=这个字符串重载就比较常用了,它的作用也是连接一个字符串str在string字符串的末尾,而operator+=不仅可以针对单个字符,同时也可以针对一个字符串

4,c_str

        该函数则是用于返回string中的字符串的指针

5,find

        find(char c,size_t n)则是从string字符串的第n个位置开始向后寻找与c相同的字符,并立马停止且返回该字符的下标(n的缺省值为0),若没有找到,则会返回string::npos(一个很大的整数值)。

int main()
{string s1("hello world");int pos = s1.find('d');return 0;
}

6,substr

        substr(size_t pos,size_t len=npos)的作用是将从pos位置开始,长度为len的字符串内容取出,并且返回出来。当我们没有给len赋值时,系统则会默认将pos之后的所有字符取完并拿出来赋值

int main()
{string s1("hello world");string s2;s2 = s1.substr(6);//从s1中的下标为6的位置开始向后截取完for (auto ch : s2)//使用范围for进行打印{cout << ch;}return 0;
}

        那么代码一走,我们的程序结果如下:

六,string类非成员函数

 1,operator<<和operator>>

        想要打印或者输入string类中的字符串内容?很简单,C++已经帮我们字符串重载好了。当我们想要对某个string类的对象进行内容的输入和输出时,那么我们就可以直接使用<<>>,示例如下:

int main()
{string s1;cin >> s1;cout << s1;return 0;
}

        那么代码一走,我们输入"hello",结果如下:

2,getline

        我们现在学习一个getline函数,它比operator>>更加的强大,getline函数只会在遇到换行时才会停止,并不会像operator>>一样遇到空格就停止,而它的使用示例如下:

int main()
{string s1;getline(cin, s1);//输入hello worldcout << s1 << endl;return 0;
}

         若我们想要getline函数在遇到特定的字符停下,我们则可以如下使用:

int main()
{string s1;getline(cin, s1,'*');//输入hello w*orld,使getline在遇到*时停下cout << s1 << endl;return 0;
}

七,结语

        这是string类的基本介绍,看完了这些,那么相信你对string类也有了初步了解,能够正常的使用这个类了,接下来我会更新vector类的讲解,这个类也是一个C++中不可或缺的知识点,学习了它,那你写代码就会直接飞起来,尽情期待吧!

这篇关于从零开学C++:string类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115814

相关文章

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方