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对象s的pos位置开始,截取长度为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*)赋值给当前stringstring& 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::npos 是 std::string 类的静态无符号常量 ,是 size_t 类型的最大值(本质是 -1 强转为无符号数),核心作用是:
- 作为查找函数(
find/rfind等)查找失败时的返回值,表示 "无效位置"。 - 常用于条件判断,检查字符串查找、子串截取等操作是否成功。
- 注意:它是无符号整数 ,直接和
-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 个字符为 strstring.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位置查找字符/字符串,没找到返回npossize_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个字符;若len为npos,截取到字符串末尾 -
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)