从零开学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

相关文章

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.