C++ string详解

本文介绍了C++中std::string类的基本操作,包括字符串的构造、赋值、长度和容量的查询,以及访问和修改字符串的方法。重点讲解了如string(),assign(),length(),capacity(),reserve()等成员函数的用法,并通过示例代码进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、字符串的构造和赋值

二、字符串的长度和容量

三、字符串的访问和修改


在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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值