1. 简述
C++的 std::string 类是C++标准库中的一个非常重要的类,用于表示和操作字符串。std::string 提供了大量的成员函数,可以方便地对字符串进行各种操作,如连接、比较、查找、替换等。相比于C语言的字符数组,std::string 更加安全,易于使用,且功能更加强大。
2. std::string初始化
std::string有多重初始化的方式,具体可参照如下。
std::string str1; ///< 创建一个空字符串, 通过empty()判断会返回true.
std::string str2 = "Hello, China!"; ///< 通过C风格字符串初始化
std::string str3("Hello, China!"); ///< 通过构造函数初始化
std::string str4 = str33; ///< 通过其他std::string对象初始化
std::string str5(10, 's'); ///< 创建一个由10个'a'字符组成的字符串
3. std::string操作
(1)访问字符
std::string访问其中的字符可以直接使用下标(一般内存连续的对象访问都可以使用下标)。
std::string s = "Hello";
s[0] = 'h'; ///< 将第一个字符修改为'h'
(2)追加字符串
std::string提供了append来追加字符串,同时也重载了operator+来实现追加操作。
std::string s1 = "Hello";
std::string s2 = " World";
s1.append(s2); ///< s1现在为"Hello World"
s1 = s1 + "!"; ///< s1现在为"Hello World!"
(3)查找子字符串
std::string提供了find和rfind来查找子字符串,返回子字符串所在的索引位置。
std::string s = "Hello, World!";
size_t pos_0 = s.find("World"); ///< pos_0现在为7,即"World"在s中的开始位置
size_t pos_1 = s.rfind("World"); ///< pos_1现在为7,即"World"在s中的开始位置
(4)替换子字符串
std::string提供了replace来替换子字符串,其原型如下:
std::string& replace (size_t pos, size_t len, const string& str);
其中,pos为要被替换的起始位置,len为要被替换的字符串长度,str为要被替换的字符串。
使用示例如下。
std::string s = "Hello, World!";
s.replace(0, 5, "Universe"); ///< s现在为"Hello, Universe!"
(5)插入子字符串
std::string提供了insert来执行子字符串的插入,insert的原型如下。
string& insert (size_t pos, const string& str);
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
string& insert (size_t pos, const char* s);
string& insert (size_t pos, const char* s, size_t n);
string& insert (size_t pos, size_t n, char c);
典型的使用例程如下。
std::string s = "Hello";
s.insert(s.length(), " World"); ///< s现在为"Hello World"
(6)删除子字符串
std::string提供了erase来执行子字符串的删除,原型如下。
string& erase(int pos=0, int n=npos);
pos指定要删除的子字符串起始位置,n指定要删除的子字符串的结束位置。
使用例程如下。
std::string s = "Hello";
s.erase(s.find(" "), 1); ///< s现在为"HelloWorld"
(7)获取字符串长度
std::string提供了length()来获取指定字符串的长度,使用例程如下。
std::string s = "Hello, World!";
size_t len = s.length(); ///< len现在为13
(8)字符串判空
std::string提供了empty()来判断指定字符串是否为空,空返回true,否则返回false。
(9)与C风格互转
std::string可以与C风格的char*进行互转。
std::string转char*: 使用c_str()或data(),可以获得char*型指针。
char*转std::string: 通过直接赋值进行转换。
(10)比较字符串
可以使用 ==、!=、<、>、<=、>= 等操作符来比较两个字符串。
判断相等还是不相等,取决于所有的字符串是否全部一致。
大于和小于,取决于第一个不相等的字符的ASCII码。
判断=>和=<可参照如下例程进行理解。
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
std::string str1 = "apple";
std::string str2 = "banana";
std::string str3 = "app";
if (str1 >= str2) {
std::cout << "str1 is greater than or equal to str2" << std::endl;
} else {
std::cout << "str1 is less than str2" << std::endl;
}
if (str1 <= str3) {
std::cout << "str1 is less than or equal to str3" << std::endl;
} else {
std::cout << "str1 is greater than str3" << std::endl;
}
return 0;
}
在这个例子中,第一个判断 str1 >= str2 会评估为 false,因为 "apple" 字典顺序上小于 "banana"。第二个判断 str1 <= str3 也会评估为 false,因为 "apple" 字典顺序上大于 "app"。
字符串的比较是基于字符的ASCII值进行的,因此它是区分大小写的,大写字母在ASCII表中排在小写字母前面。例如,"A" 的ASCII值小于 "a" 的ASCII值,所以字符串 "Apple" 会被认为小于字符串 "apple"。