STL——String类

STL2. String

文章目录

  • [STL2. String](#STL2. String)
    • [2.1 构造函数](#2.1 构造函数)
    • [2.2 赋值操作](#2.2 赋值操作)
    • [2.3 string::npos](#2.3 string::npos)
    • [2.4 string::operator[]以及at](#2.4 string::operator[]以及at)
    • [2.5 关于容量的一些方法](#2.5 关于容量的一些方法)
    • [2.6 关于修改的一些方法](#2.6 关于修改的一些方法)
    • [2.7 关于查找的一些方法](#2.7 关于查找的一些方法)
    • [2.8 其他方法](#2.8 其他方法)

2.1 构造函数

(constructor)构造函数名称 功能说明
string() (重点) 默认构造,构造空的string类对象,即空字符串
string(const char* s) (重点) 用C-string来构造string类对象
string(const string& s) (重点) 拷贝构造函数
string(size_t n, char c) string类对象中包含n个字符c
string(const string& s, size_t pos, size_t len = npos) string对象spos位置开始,截取长度为len的子串,构造新的string对象
c++ 复制代码
#include<string>
#include<iostream>
int main()
{
    std::string s1;
    std::string s2("LYX");
    std::string s3(s2);
    
    std::cin >> s1;
    std::cout << s1 << std::endl;
    return 0;
}

2.2 赋值操作

  • string& operator=(const char* s); //把 C 风格字符串(char*)赋值给当前 string
  • string& operator=(const string& s); //把另一个 string 对象赋值给当前对象(拷贝赋值)
  • string& assign(const char* s); //功能和 operator=(const char* s) 完全一致,把 C 字符串赋值给当前对象
  • string& assign(const string& s); //功能和 operator=(const string& s) 完全一致,把另一个 string 赋值给当前对象
  • string& assign(size_t n, char c); // 用 n 个相同字符 c 填充当前字符串(比如 assign(5, 'a') 会变成 "aaaaa"
c++ 复制代码
 string s1 = "Hello World!";	// operator= (const char*):	赋值 C 风格字符串
 
 string s2 = "Test String";
 string s3 = s2;				// operator= (const string&):拷贝赋值
 
 string s4;
 s4.assign("Hello Assign");		//赋值 C 风格字符串(assign 版)
 

2.3 string::npos

string::nposstd::string 类的静态无符号常量 ,是 size_t 类型的最大值(本质是 -1 强转为无符号数),核心作用是:

  1. 作为查找函数(find/rfind 等)查找失败时的返回值,表示 "无效位置"。
  2. 常用于条件判断,检查字符串查找、子串截取等操作是否成功。
  3. 注意:它是无符号整数 ,直接和 -1 比较会出问题,必须用 size_t 类型接收返回值再和 string::npos 比较。
c++ 复制代码
string s = "Hello, World!";
size_t pos; // 必须用 size_t 接收,和 npos 类型匹配
 
pos = s.find("World");
if (pos != string::npos) { cout << "找到 \"World\",位置:" << pos << endl;} 
	else { cout << "未找到 \"World\"" << endl; }
pos = s.find("China");
    if (pos == string::npos) {cout << "未找到 \"China\"" << endl;}

注意:int有符号整数 ,可正可负,范围大约 -21 亿~+21 亿size_t无符号整数永远 >= 0 ,范围 0 ~ 42 亿(是 int 的 2 倍大)

因为:字符串的长度、下标、位置 不可能是负数!所以 STL 统一用 size_t 表示大小、位置、长度。find()size()length() 返回的都是 size_t,不是 int!

2.4 string::operator[]以及at

​ string重载了[]操作符,使操作字符串可以和操作数组那样方便且容易。

at也可用于安全地访问字符串中的单个字符,与 operator[] 相比,at() 会进行边界检查,若索引越界则抛出 std::out_of_range 异常,因此更适合需要严格安全性的场景。

c++ 复制代码
std::string str = "Hello";
char ch = str[1];		//[]访问
char c = str.at(2);		//at访问

2.5 关于容量的一些方法

  • string.length():获得字符串长度,**length只适用于字符串。**C语言使用的是strlen()

  • string.size()也是获得字符串长度,但是size()也适用于其他容器。size()更为常用。

  • string.capacity():返回当前 std::string 对象所分配的内存空间能够容纳的字符数量,这个数量不包含字符串结束符 '\0'。要注意,capacity() 返回的容量和 size() 或者 length() 返回的字符串实际长度并非同一概念。size()length() 返回的是字符串中实际存在的字符数量,而 capacity() 返回的是字符串当前已分配的内存能够容纳的字符数量。

    可以手动调整容量,使用 reserve() 函数手动为 std::string 对象预留一定的容量,从而减少内存重新分配的次数。

    注意:无论是 reserve(100) ,还是string.capacity(),它们的值都不包括"/0",所以 reserve(100) 的容量至少会是 100 个字符的空间,这 100 个空间专门用于存放字符串的内容,不包含 '\0'

  • string.clear():清空字符串,这是size()会变为0,但它的容量(即 capacity() 返回的值)通常不会改变,除非标准库实现有特殊优化。

  • string.empty():判断字符串是否为空(等价于 size() == 0)。

2.6 关于修改的一些方法

  • void push_back(char ch):主要功能是将一个字符添加到 std::string 对象的末尾。该字符作为参数传递给函数。
  • string& append(const string& str//const char* s//size_t n, char ch) :函数的主要功能是把指定的内容添加到 std::string 对象的末尾。可以追加的内容包括其他字符串、字符串的子串、字符数组。
  • operator+=std::string 类对 += 运算符进行了重载,用于将一个字符、字符串或者字符串的一部分追加到 std::string 对象的末尾。
  • string.insert(size_t pos, const string& str//size_t pos, size_t n, char ch)insert() 函数允许你在 std::string 对象的指定位置插入新的内容,这些内容可以是单个字符、多个相同字符、std::string 对象或 std::string 对象的子串等。
  • string.erase(size_t pos = 0, size_t len = npos):从 pos 开始删 len 个字符
  • string.replace(size_t pos, size_t len, const string& str):从 pos 开始,替换 len 个字符为 str
  • string.swap(): 主要功能是高效 地交换两个 std::string 对象的内容。
  • string.resize(size_t n, char c):调整字符串长度为 n:若 n < size(),截断字符串;若 n > size(),补 '\0''c'
  • string.pop_back():(C++11)删除字符串最后一个字符(替代 erase(s.size()-1, 1),更高效)

2.7 关于查找的一些方法

  • size_t find(const string& str, size_t pos = 0//const char* s, size_t pos = 0):从pos位置查找字符/字符串,没找到返回npos
  • size_t rfind(const string& str, size_t pos = npos//const char* s, size_t pos = npos):从字符串末尾往前找,找到就返回下标,找不到返回 npos
  • find_first_of:在字符串里查找指定字符集合中任意一个字符首次出现的位置。
  • find_last_of:在字符串里查找指定字符集合中任意一个字符最后一次出现的位置。
  • find_first_not_of:在字符串里查找不在指定字符集合中的第一个字符的位置。
  • find_last_not_of:在字符串里查找不在指定字符集合中的最后一个字符的位置。

2.8 其他方法

  • string.substr(size_t pos = 0, size_t len = npos) :截取子串:从 pos 开始,截取 len 个字符;若 lennpos,截取到字符串末尾

  • string.copy(char* dest, size_t len, size_t pos = 0):拷贝字符到字符数组:从 pos 开始拷贝 len 个字符到 dest不自动加 '\0'

  • string.compare(const string& str):字符串比较:返回值:<0(当前串更小)、0(相等)、>0(当前串更大);支持多参数重载(指定子串比较)

  • std::to_string(T value):(全局函数)将数值类型(int/float/double 等)转为 std::string

  • std::stoi/stol/stoll/stof/stod():(全局函数)将 std::string 转为对应数值类型(stoi = 转 int,stod = 转 double)

相关推荐
Severus_black2 小时前
算法题C——用队列实现栈/用栈实现队列
c语言·数据结构·算法·链表
沐知全栈开发2 小时前
Bootstrap 下拉菜单
开发语言
谭欣辰2 小时前
详细讲解 C++ 有向无环图(DAG)及拓扑排序
c++·算法·图论
XS0301062 小时前
Java 基础(七)多态
java·开发语言
不知名的老吴2 小时前
一文读懂:单例模式的经典案例分析
java·开发语言·单例模式
欧米欧2 小时前
C++算法之双指针算法
开发语言·c++
承渊政道2 小时前
【递归、搜索与回溯算法】(掌握记忆化搜索的核心套路)
数据结构·c++·算法·leetcode·macos·动态规划·宽度优先
REDcker2 小时前
跨平台编译详解 工具链配置与工程化实践
linux·c++·windows·macos·c·跨平台·编译
天天进步20152 小时前
Python全栈项目实战:自建高效多媒体处理工具
开发语言·python