C++ | string用法指南
温馨提示:这篇文章已超过406天没有更新,请注意相关的内容是否还可用!
目录
前言
一、初始string
1、string是什么
2、string的使用
(1)构造函数
(2)赋值重载
(3)容量相关接口
(4) 迭代器
(5)元素访问
(6)修改
(7)其他类型函数
(8)非成员函数
前言
本文主要介绍STL容器之一 ---- string,在学习C++的过程中,我们要将C++视为一个语言联邦(摘录于Effective C++ 条款一)。如何理解这句话呢,我们学习C++,可将其分为四个板块;分别为C、Object-Oriented C++(面向对象的C++)、Template C++(模板)、STL。本文就介绍STL中的string;
一、初始string
string,顾名思义,字符串的意思,在C语言中,我们用字符数组来代替字符串,而C++中,我们使用自定义类型string,本文采用先使用,再模拟实现的方式介绍string;首先我们需要学习string的具体使用方法,随后进行模拟实现,巩固对string的认识;本文所有的用法参考C++文档 C++参考文档
1、string是什么
string是STL文档的容器之一,是一个自定义类型,是一个类,由类模板basic_string实例化出来的一个类;
类模板basic_string实例化出来了四个类,如下图所示;
实例化出的这四个类不同的是他们的编码方式,分别为 char、char16_t、char32_t、wchar_t 这四种;这里提出了一个新的概念,编码;那么什么是编码呢?其实早在我们学习C语言时,我们就接触过编码;没错,就是ASCII(美国信息交换标准代码);以下来自百度百科;
什么意思呢,在我们的计算机中,所有的数据只能够以01二进制编码的方式储存,ASCII就是将日常使用的一些符号数字字母收集起来;用数字一一对应表示;而随着计算机的发展,ASCII并不够满足各国的语言,只能针对于英语;因此,为了更好的传播计算机,出现了各种编码;Unicode(万国码)就是其中的一个代表;
由于各国语言的差异,可能存在一个字节不能够一一对应文字的情况,不像英文由26个英文字母组成单词,只需保存26个字母即可,而实际上许多国家的语言并不能由一字节的空间能表示出来,因此由不同储存方式繁衍出了 UTF-8、UTF-16、UTF-32,其中数字代码比特位;其中上述 basic_string 实例化出的类储存方式如下:
char --- 1字节
char16_t --- 2字节
char32_t --- 4字节
wchar_t --- 2字节
总结:上述知识需要有几个基本的了解,我们需记住string是basic_string实例出来的一个类,其类型为一个字节的char;
2、string的使用
由于string出现的时间实际是早于STL的,是后来划分进STL库的,所以string开始的设计比较冗余,有许多没有必要的接口(一共106个接口函数);这也是被广大C++程序员吐槽的一个槽点,我们无需将每一个接口都记住,我们需要将核心接口记住并熟练使用,遇见一些默认的接口查看文档即可;
(1)构造函数
在C++98中,string的构造函数一种有如下7种;
int main() { // 1、无参默认构造 // string(); string s1; // 2、拷贝构造 // string (const string& str); string s2(s1); // 4、通过字符串常量初始化 // string (const char* s); string s4("hello world"); // 3、通过字符串子串初始化 // string (const string& str, size_t pos, size_t len = npos); string s3(s4, 5, 5); // 5、通过字符串前n个字符初始化 // string (const char* s, size_t n); string s5("hello wrold", 6); // 6、用n个字符c初始化字符串 // string (size_t n, char c); string s6(10, 'x'); // 7、迭代器区间初始化(暂不介绍) return 0; }
其中提一下第三种,pos为子串的位置,len子串的长度,若len大于从子串pos位置开始后面字符总数,则表示初始化到子串结尾即可,比如我们要用 “hello world” 初始化字符串,若pos为6,len为20,则用world初始化字符串s1;len还有一个缺省值npos,其数值为无符号整型的-1,也就是无符号的最大值(无符号无负数);
(2)赋值重载
赋值重载使string能够用=对string对象重新赋值,string的赋值重载一共有有如下三种;
int main() { string tmp("hello world"); string s1; string s2; string s3; // 1、string类进行赋值重载 s1 = tmp; // 2、使用字符串常量赋值重载 s2 = "hello world"; // 3、使用字符赋值重载 s3 = 'A'; return 0; }
(3)容量相关接口
以下为string类容量相关接口,其中最后一个为缩容接口,由于性能原因,使用的并不多;
首先介绍如下六个简单一些的接口;
int main() { string s1("hello world"); // string中储存的字符个数(不包括\0) cout