std::string

发布于:2024-10-09 ⋅ 阅读:(55) ⋅ 点赞:(0)

std::string是C++标准库中的一个基本类模板,专门用于处理字符串。它提供了一个可变长度的字符序列,以及一系列用于字符串操作的方法。std::string是值类型,这意味着当它作为函数参数传递或赋值时,整个字符串数据会被复制。

std::string的特性:

  • 可变长度:std::string可以动态地调整大小以存储不同长度的字符串
  • 随机访问:std::string可以通过索引随机访问字符
  • 自动内存管理:无需手动管理内存,std::string会自动分配和释放内存
  • 模板类:std::string是一个模板类,但通常用于char类型的字符串

std::string对象通常包含了一个指向堆上分配的内存的指针,用于存储较长的字符串。较短的字符串可能会直接存在对象本身的内部缓冲区,有些实现还会使用一个独立的缓冲区来存储字符串内容。

std::string提供了一系列成员函数来操作对象:

  • 构造函数

    • std::string():默认构造一个空字符串

    • std::string(const char* str):从C风格字符串构造

    • std::string(const std::string& str):拷贝构造函数,深拷贝

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::cout << str << std::endl;  // abc12345
      
      std::string new_str1(str);  // 拷贝构造,深拷贝
      std::cout << str << std::endl;  // abc12345
      std::cout << new_str1 << std::endl;  // abc12345
      
      std::string new_str2(std::move(str));  // 移动构造
      std::cout << str.size() << std::endl;  // 0
      std::cout << new_str2 << std::endl;  // abc12345
      
      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      const char* cstr = str.c_str();  // c_str()返回指向字符串第一个字符的指针
      std::cout << *cstr << std::endl;  // a
      std::cout << cstr << std::endl;  // abc12345
      
      c_str()返回的指针指向的是一个只读的C风格字符串,这意味着不能通过这个指针来修改std::string对象中字符串的内容。
      
  • 赋值操作

    • 赋值运行符 =:将一个字符串的内容复制给另一个字符串

    • swap(std::string& other):交换两个字符串的内容

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      
      std::string new_str = str;  // 赋值操作,深拷贝
      std::cout << str << std::endl;  // abc12345
      std::cout << new_str << std::endl;  // abc12345
      
      std::string swap_str = "678";
      str.swap(swap_str);  // 交换两个字符串
      std::cout << str << std::endl;  // 678
      std::cout << swap_str << std::endl;  // abc12345
      
  • 连接字符串

    • operator +:连接两个字符串

    • operator +=:将另一个字符串连接到当前字符串

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::string new_str = "678";
      
      std::string conn_str = str + new_str;  // 连接字符串
      std::cout << conn_str << std::endl;  // abc12345678
      
  • 访问字符

    • operator[]:通过索引访问字符串中的字符

    • at(size_type n):通过索引访问字符串中的字符,带边界检查

    • front():返回字符串中的第一个字符

    • back():返回字符串中的最后一个字符

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::cout << str[1] << std::endl;  // 访问索引为1的字符,b
      std::cout << str.at(7) << std::endl;  // 访问索引为7的字符,5
      std::cout << str.front() << std::endl;  // 返回第一个字符,a
      std::cout << str.back() << std::endl;  // 返回最后一个字符,5
      
  • 查找和替换

    • find():在字符串中查找子字符串或字符

    • replace():替换字符串中的部分内容

      std::string str = "abc12345cba";  // 创建一个字符串,并进行初始化
      std::cout << str.find("b") << std::endl;  // 查找字符串中从左到右的第一个字符b,并返回其索引,1
      std::cout << str.rfind("b") << std::endl;  // 查找字符串中从右到左的第一个字符b,并返回其索引,9
      std::cout << str.find("abc") << std::endl;  // 查找字符串中的子字符串,返回其开头索引,0
      std::cout << str.find("abcd") << std::endl;  // 若查找不到子字符串或字符,则返回一个随机数,18446744073709551615
      
      str.replace(3, 5, "321");  // 从索引为3的字符开始,将5个字符换成321
      std::cout << str << std::endl;  // abc321cba
      
  • 修改字符串

    • push_back(char ch):在字符串末尾添加一个字符

    • pop_back():移除字符串末尾的字符

    • append(std::string& other):在字符串末尾添加一个字符串

    • erase():删除字符串中的指定位置或指定范围的字符

    • assign(std::string& other):用新的字符串替换原有内容

    • insert():在指定位置插入字符或字符串

    • resize():修改字符串的大小

    • clear():清空字符串

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      
      str.push_back('A');  // 字符串末尾添加一个字符
      std::cout << str << std::endl;  // abc12345A
      
      str.pop_back();  // 移除字符串末尾的字符
      std::cout << str << std::endl;  // abc12345
      
      str.append("678A");  // 字符串末尾添加字符串
      std::cout << str << std::endl;  // abc12345678A
      
      str.erase(5);  // 删除字符串中索引为5及以后的字符
      std::cout << str << std::endl;  // abc12
      str.erase(1, 3);  // 删除字符串中索引从1开始的3个字符
      std::cout << str << std::endl;  // a2
      
      str.assign("678");  // 用新的字符串替换掉原来的字符串
      std::cout << str << std::endl;  // 678
      
      str.clear();  // 清空字符串
      std::cout << str.size() << std::endl;  // 0
      
  • 子字符串

    • substr():提取子字符串

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::string sub_str = str.substr(2, 4);  // 提取从索引2开始共4个字符的子字符串
      std::cout << sub_str << std::endl;  // c123
      
  • 容量

    • length():返回字符串的长度

    • size():返回字符串中的字符数量,也就是字符串长度

    • capacity():返回字符串的容量

    • reserve():更改容量

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      std::cout << str.length() << std::endl;  // 8
      std::cout << str.size() << std::endl;  // 8
      std::cout << str.capacity() << std::endl;  // 15
      
      str.push_back('6');
      std::cout << str.capacity() << std::endl;  // 15
      
      str.reserve(20);  // 更改容量,容量会变得更大,但不一定是给出的值,因为容量的变化是按照指数或线性规律来的
      std::cout << str.capacity() << std::endl;  // 31
      
      长度表示字符串当前实际包含的字符数,而容量表示分配给字符数组的内存空间大小。当字符串的长度超过容量时,std::string会重新分配更大的内存空间,并将原有的字符复制到新的内存位置。
      
      当std::string对象的生命周期结束时,它会自动释放所分配的内存,不需要手动调用delete或free()释放字符串的内存,因为std::string类会在对象销毁时自动调用相应的析构函数来释放内存。
          
      与C语言中的字符串类似,std::string的底层实现也会在字符数组的末尾添加一个空终止字符(‘\0’),以表示字符串的结束。这样可以使得std::string类的接口与标准C字符串函数兼容,但是std::string的size()length()不会统计('\0')。
      
  • 迭代器

    • begin():返回指向第一个字符的迭代器

    • end():返回指向尾后一位的迭代器

      std::string str = "abc12345";  // 创建一个字符串,并进行初始化
      for (auto it = str.begin(); it != str.end(); ++it) {
          std::cout << *it << std::endl;  // a b c 1 2 3 4 5
      }
      for (auto value : str) {
          std::cout << value << std::endl;  // a b c 1 2 3 4 5
      }
      
  • 其他成员函数

    • data():返回指向字符串第一个字符的指针
    • c_str():返回指向字符串第一个字符的指针
    • empty():检查字符串是否为空