std :: string和std :: wstring
标准库包含许多有用的类,但最有用的可能是std :: string。std :: string(和std :: wstring)是一个字符串类,它提供许多操作来分配,比较和修改字符串。在本章中,我们将深入研究这些字符串类。
注意:C风格的字符串将被称为“C风格的字符串”,而std :: strings(和std :: wstring)将简称为“字符串”。
字符串类
在上一课中,我们介绍了 C风格的字符串,它使用char数组来存储字符串。如果你试图用C风格的字符串做任何事情,你很快就会得出这样的结论:它们很难处理,容易搞乱,而且难以调试。
C风格的字符串有许多缺点,主要围绕着你必须自己完成所有内存管理的事实。例如,如果要将字符串“hello!”分配给缓冲区,则必须首先动态分配正确长度的缓冲区:
char *strHello = new char[7];
不要忘记为null终止符占一个额外的字符!
然后你必须实际复制值:
strcpy(strHello, "hello!");
希望你的缓冲区足够大,那样才会没有缓冲区溢出!
当然,因为字符串是动态分配的,所以当你完成它时你必须记住正确地释放它:
delete[] strHello;
不要忘记使用数组删除而不是正常删除!
此外,C提供用于处理数字的许多直观运算符(例如赋值和比较)根本不适用于C风格的字符串。有时这些似乎可以工作,但实际上会产生不正确的结果, 例如,使用==比较两个C风格的字符串实际上会进行指针比较,而不是字符串比较。使用operator =将一个C风格的字符串分配给另一个字符串似乎首先工作,但实际上是在做一个指针副本(浅拷贝),这通常不是你想要的。这些事情可能导致程序崩溃,很难找到和调试!
最重要的是,使用C风格的字符串需要记住许多关于什么是安全/不安全的挑剔规则,记住一堆具有有趣名称的函数,如strcat()和strcmp(),而不是使用直观的运算符,并有很多手动内存管理。
幸运的是,C ++和标准库提供了一种更好的处理字符串的方法:std :: string和std :: wstring类。通过使用构造函数,析构函数和运算符重载等C ++概念,std :: string允许您以直观和安全的方式创建和操作字符串!没有更多的内存管理,没有更奇怪的函数名称,并且灾难的可能性大大降低。
字符串概述
标准库中的所有字符串功能都位于头文件中。要使用它,只需包含字符串标题:
#include <string>
字符串头中实际上有3个不同的字符串类。第一个是名为basic_string <>的模板化基类:
namespace std
{
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
class basic_string;
}
您不会直接使用此类,因此不要担心目前的特征或分配器是什么。在几乎所有可以想象的情况下,默认值都足够了。
标准库提供了两种basic_string <>:
namespace std
{
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
}
这些是您实际使用的两个类。std :: string用于标准的ascii(utf-8)字符串。std :: wstring用于宽字符/ unicode(utf-16)字符串。utf-32字符串没有内置类(尽管如果需要,你应该可以从basic_string <>扩展自己的类)。
虽然您将直接使用std :: string和std :: wstring,但所有字符串函数都在basic_string <>类中实现。String和wstring能够通过模板化直接访问该函数。因此,所有呈现的函数都适用于字符串和wstring。但是,因为basic_string是一个模板化的类,所以当你用字符串或wstring执行语法错误时,编译器也会产生可怕的模板错误。不要被这些错误所吓倒; 他们看起来比他们实际的简单得多!
这是字符串类中所有函数的列表。这些功能中的大多数具有多种风格来处理不同类型的输入,我们将在下一课中更深入地介绍这些函数。
虽然标准库字符串类提供了许多功能,但有一些值得注意的:
正则表达式支持
用于从数字创建字符串的构造函数
大写/大写/小写函数
不区分大小写的比较
将字符串标记/拆分为数组
空白修剪
格式化字符串sprintf样式
从utf-8转换为utf-16,反之亦然
对于其中的大多数,您必须编写自己的函数,或者将字符串转换为C风格的字符串(使用c_str())并使用提供此功能的C函数。
在接下来的课程中,我们将更深入地研究字符串类的各种函数。虽然我们将使用字符串作为示例,但一切都同样适用于wstring。