目录
2.4 指定长度和初始字符初始化(C++11 及之后版本支持)
2.6 使用部分字符范围初始化(C++11 及之后版本支持)
一、C++ 字符串的基本概念
在 C++ 中,字符串是由一系列字符组成的序列,用于存储文本信息。C++ 标准库提供了多种方式来处理字符串,其中最常见的是使用std::string类。std::string是一个动态数组,可以自动管理内存,并且提供了丰富的成员函数来操作字符串,这使得它在处理字符串时比传统的 C 风格字符串更加方便和安全 。
比如,我们想要定义一个表示名字的字符串,如果使用 C 风格字符串,可能需要这样写:
char name[20] = "Alice";
这里我们需要预先指定数组的大小,而且在进行字符串操作时,还需要手动处理字符串的结束符'\0',稍不注意就容易出错。但如果使用std::string类,代码就简洁很多:
#include <string>
std::string name = "Alice";
std::string类会自动管理内存,不需要我们手动指定大小,也不用担心字符串结束符的问题,使用起来更加便捷。
二、字符串的定义与初始化
std::string类提供了多种灵活的定义和初始化方式,以满足不同的编程需求 。
2.1 默认初始化
使用默认构造函数可以创建一个空字符串,如下所示:
#include <string>
std::string emptyStr;
这种方式创建的emptyStr不包含任何字符,其长度为 0,常用于需要先定义字符串,后续再进行赋值操作的场景,比如在函数内部先声明一个字符串变量,然后根据不同的逻辑来填充它。
2.2 使用字符串字面量初始化
这是最常见的初始化方式,直接用双引号括起来的字符串字面量来初始化std::string对象:
std::string greeting = "Hello, World!";
也可以使用直接初始化的方式:
std::string greeting("Hello, World!");
这两种方式效果相同,greeting被初始化为包含 "Hello, World!" 内容的字符串 。这种方式适用于在定义字符串时就明确知道其初始值的情况,简单直观。
2.3 从其他std::string对象初始化
可以使用已有的std::string对象来初始化一个新的对象,这相当于对原字符串进行复制:
std::string original = "example";
std::string copy(original);
或者使用赋值运算符的形式:
std::string original = "example";
std::string copy = original;
经过这样的操作,copy和original具有相同的内容。这种方式在需要对字符串进行备份,或者将一个字符串传递给另一个函数并希望保持其独立性时很有用。
2.4 指定长度和初始字符初始化(C++11 及之后版本支持)
可以指定创建的字符串对象的长度,并使用某个字符进行填充初始化:
std::string filled(5, '*');
上述代码创建了一个长度为 5,且每个字符都是*的字符串,即"*****" 。这种初始化方式在需要创建特定长度且字符重复的字符串时非常方便,比如用于绘制分隔线等场景。
2.5 使用花括号初始化器(C++11 及之后版本支持)
使用花括号进行初始化,这种方式更加统一和直观:
std::string message{"Welcome to C++ programming"};
或者
std::string message = {"Welcome to C++ programming"};
这两种形式都能将message初始化为指定的字符串内容 。花括号初始化器可以帮助防止某些类型的窄化转换,并且在代码可读性上有一定优势。
2.6 使用部分字符范围初始化(C++11 及之后版本支持)
利用已有字符串对象的部分字符范围来初始化新的字符串对象:
std::string original = "abcdefg";
std::string part(original.begin() + 2, original.begin() + 5);
在这个例子中,part会被初始化为包含从original中索引为 2(对应字符c)开始到索引为 4(对应字符e)结束的字符,即"cde" 。当需要从一个长字符串中提取特定部分的子串时,这种初始化方式就派上用场了。
2.7 通过移动语义初始化(C++11 及之后版本支持)
如果有一个临时的std::string对象(比如函数返回的string临时值),可以利用移动语义高效地初始化新的std::string对象:
std::string createTempString() {
return std::string("Temp");
}
int main() {
std::string newStr = createTempString();
return 0;
}
在上述代码中,newStr通过移动语义接收了createTempString函数返回的临时std::string对象的资源,避免了不必要的复制开销,提高了效率。在处理临时对象时,移动语义初始化能显著提升性能,特别是在处理大量数据或对性能要求较高的场景中。
三、常用操作方法
在掌握了 C++ 字符串的基本概念和初始化方式后,接下来我们深入了解std::string类提供的各种常用操作方法,这些方法是高效处理字符串的关键 。
3.1 访问字符
使用下标运算符 []:通过下标运算符[]可以直接访问字符串中的特定位置字符,下标从 0 开始 。例如:
std::string str = "example";
char ch = str[2];
上述代码中,ch将被赋值为'a',因为索引为 2 的字符是'a' 。这种方式简洁直观,适用于对字符串进行快速的随机访问。但需要注意的是,如果使用[]访问超出字符串长度的位置,不会抛出异常,而是导致未定义行为,这在编写代码时需要特别小心。
使用成员函数 at():at()函数也用于访问字符串中的字符,它与[]的功能类似,但at()函数会进行边界检查 。比如:
std::string str = "example";
try {
char ch = str.at(2);
} catch (const std::out_of_range& e) {
std: