目录
在C++中,String是标准库中的一个类,用于表示字符串。使用String类可以方便创建、存储和操作字符串,而不必手动管理内存和指针。
String类提供了许多操作字符串的方法,下面我们来介绍一些常用的方法:
一、字符串的构造和赋值
- string():默认构造函数,创建一个空字符串。
- string(char ch):使用字符ch创建一个字符串。
- string(const char* s):使用C风格字符串s创建一个字符串。
- string(const string& str):使用另一个字符串str创建一个新的字符串。
- operator=():赋值操作符,用一个字符串或字符数组来赋值。
- assign():将一个字符串或字符数组赋值给串对象,其接受一个或两个参数:第一个参数是要赋值的字符串或字符数组,第二个参数是要赋值的字串的起始位置和长度(可选)。
函数原型:
string& assign (const string& str); //str是要赋值的字符串对象
string& assign (const string& str, size_t subpos, size_t sublen);//subpos是要赋值的字符串的起始位置,sublen是要赋值的字符串的字串长度
string& assign (const char* s); //s是要赋值的字符数组
string& assign (const char* s, size_t n); //n是要赋值的字符数组的长度
string& assign (size_t n, char c); //c是要赋值的字符,n是重复次数
示例如下:
string str1; // 创建一个空字符串
string str2('a'); // 创建一个包含字符'a'的字符串
string str3("hello"); // 创建一个包含字符串"hello"的字符串
string str4(str3); // 创建一个使用str3初始化的新字符串
string str5 = "world"; // 创建一个包含字符串"world"的字符串
string str6 = str5; // 使用str5来初始化str6
二、字符串的长度和容量
在C++中,可以使用 std::string 类的 length() 和 capacity() 成员函数来获取字符串的长度和容积。
- size() 或 length(): 返回字符串中字符的数量(不包括结尾的 null 字符)。
例如:
std::string str = "Hello, World!";
int len = str.length(); // 返回 13
- capacity():返回字符串对象分配的内存容量。当
std::string
对象中的字符数增加时,其容量也会增加,以确保可以容纳更多的字符。但是,容量的增加不一定是线性的,可能会分配比所需更多的内存。
例如:
std::string str = "Hello, World!";
int cap = str.capacity(); // 返回至少 13,可能更大
需要注意的是,capacity()
函数返回的值可能大于 length()
函数返回的值,因为 std::string
对象中的字符数可以增加,而分配的内存容量可能不会立即调整。如果需要确保容量和长度相等,可以使用 shrink_to_fit()
函数来释放多余的内存。
例如:
std::string str = "Hello, World!";
int cap1 = str.capacity(); // 返回至少 13,可能更大
str.shrink_to_fit(); // 释放多余的内存
int cap2 = str.capacity(); // 返回 13
在调用shrink_to_fit()
函数之后,std::string
对象的容量将被调整为与长度相同的值。
- reserve(size_t n):预留至少n个字符的存储空间。
在 C++ 的std::string类中,reserve(size_t n) 是一个成员函数,可以用来增加字符串对象中的内存容量。这个函数接受一个参数 n,表示要为 std::string 对象分配新的内存容量大小
reserve() 函数的作用是为 std::string 对象预留更多的内存,以便在字符串对象扩展时不需要频繁地重新分配内存。这可以提高程序的性能,因为重新分配内存是一件耗时的操作。
reserve() 函数并不会改变字符串对象的长度,只是增加其内存容量。如果在调用 reserve() 函数之后向字符串对象添加字符,字符串对象的长度将逐渐增加,但是内存容量不会随之增加,直到添加的字符数达到预留的容量大小为止。
例如:
std::string str;
str.reserve(100); // 为字符串对象预留 100 个字符的内存容量
for (int i = 0; i < 50; i++) {
str += 'a'; // 向字符串对象中添加 50 个字符
// 输出字符串对象的长度
std::cout << "Length: " << str.length() << std::endl;
// 输出字符串对象的容量
std::cout << "Capacity: " << str.capacity() << std::endl;
}
在上面的例子中,reserve() 函数被用来为字符串对象 str 预留了 100 个字符的内存容量。然 后,在一个循环中向字符串对象中添加 50 个字符。在添加这些字符时,字符串的长度逐渐增 加,但是容量并没有随之增加,直到添加的字符达到预留的容量大小为止。在最后输出的结 果中可以看到,字符串对象的长度为 50,容量为 100。
需要注意的是,调用 reserve() 函数并不会改变字符串对象中已有的字符的位置或值。如果在 调用 reserve() 函数之后直接访问字符串对象中已有的字符,其值和位置不会发生改变。
三、字符串的访问和修改
- operator[]():使用下标运算符 [] 来访问和修改字符串中的单个字符。下标从 0 开始,最大下标为字符串长度 -1。例如:
std::string str = "Hello, World!";
char c = str[0]; // 访问字符串中的第一个字符,即 'H'
str[4] = 'o'; // 修改字符串中的第五个字符,即将 'o' 替换为 'o'
- at():访问和修改字符串中的单个字符。与下标运算符类似,但是他会检查下标是否越界,并在越界时抛出 std::out_of_range 异常。例如:
std::string str = "Hello, World!";
char c = str.at(0); // 访问字符串中的第一个字符,即 'H'
str.at(4) = 'o'; // 修改字符串中的第五个字符,即将 'o' 替换为 'o'
- front() 和 back():返回字符串中的第一个字符和最后一个字符。例如:
std::string str = "Hello, World!";
char first = str.front(); // 访问字符串中的第一个字符,即 'H'
char last = str.back(); // 访问字符串中的最后一个字符,即 '!'
- data():获取指向字符串底层字符数组的指针,并可以通过指针访问和修改字符串中的字符。例如:
std::string str = "Hello, World!";
char* ptr = str.data(); // 获取指向字符串底层字符数组的指针
ptr[0] = 'h'; // 修改字符串中的第一个字符,即将 'H' 替换为 'h'
- push_back(char ch):在字符串末尾添加一个字符,其接受一个 char 类型的参数。例如:
std::string str = "Hello";
str.push_back('!'); //在字符串末尾添加字符
std::cout << str << std::endl; //输出:Hello!
需要注意的是,string.push_back()
直接修改了原始字符串对象,因此不需要将函数调用的 结果赋值回原始字符串对象。
- pop_back():从字符串末尾删除一个字符,其不接受任何参数。例如:
std::string str = "Hello!";
str.pop_back(); //删除最后一个字符
std::cout << str << std::endl; //输出:Hello
- append():使用 append() 或 加号运算符,添加字符串或字符,其接受一个字符串或字符数组作为参数。
函数原型如下:
string& append (const string& str); //str是要附加在字符串末尾的字符串对象
string& append (const string& str, size_t subpos, size_t sublen); //subpos参数是要附加字串的起始位置,sublen参数是要附加字串的长度
string& append (const char* s); //s是要附加的字符数组
string& append (const char* s, size_t n); //s是要附加的字符数组,n是字符数组的长度
string& append (size_t n, char c); //n是字符重复次数,c是要附加的字符
示例如下:
std::string str = "The "; //输出:The
str.append("quick "); //输出:The quick
str.append("red fox jumps ", 0, 8); //输出:The quick red fox
str.append({ 'j','u','m','p','s',' ', }); //输出:The quick red fox jumps
char s[] = { 'o','v','e', 'r',' ', 't', 'h', 'e' };
str.append(s, 5); //输出:The quick red fox jumps over
str.append(3, '!'); //输出:The quick red fox jumps over !!!
std::cout << str << std::endl;
- insert():在字符串中插入字符或是字串,其接受两个或三个参数:插入位置的索引、要插入的字符串或字符、要插入的字符串的字串的起始位置和长度(可选)。
函数原型:
string& insert (size_t pos, const string& str);//pos参数是要插入字符串或字符的位置的索引,str 参数是要插入的字符串对象
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);//subpos 参数是要插入的字符串的子串的起始位置,sublen 参数是要插入的字符串的子串的长度
string& insert (size_t pos, const char* s);//s 参数是要插入的字符数组
string& insert (size_t pos, const char* s, size_t n);//n 参数是要插入的字符数组的长度
string& insert (size_t pos, size_t n, char c);//c 参数是要插入的字符,n 参数重复次数
示例如下:
std::string str = "Hello, World!";
str.insert(7, "C++ "); // 在第 7 个字符后面插入 "C++ "
- erase():删除字符串中的字符或字串,其接受一个或两个参数:第一个参数是要删除的位置,第二个参数是要删除的字串长度(可选)。
函数原型:
string& erase (size_t pos, size_t len = npos);
示例如下:
std::string str = "Hello, World!";
str.erase(7, 6); // 删除从第 7 个字符开始的 6 个字符,即 "World!"
- replace():在C++中,std::string::replace() 是一个成员函数,用于替换字符串对象中的一部分字串。他接受三个参数:起始位置、替换长度和替换字符。函数原型如下:
string& replace (size_t pos, size_t len, const string& str);
示例如下:
std::string str = "The quick brown fox jumps over the lazy dog";
str.replace(16, 5, "red");
std::cout << str << std::endl;
//输出:The quick red fox jumps over the lazy dog