🎶string - 字符串
STL中string类的详细介绍
string 容器基本概念
C风格字符串(以\0结尾的字符数组)太过复杂,难于掌握,不太适合大程序的开发,所以C++STL中定义了一种string类,在头文件<string>中。
string 和 C风格字符 串对比
char*是一个指针,string是一个类string封装了char*,管理这个字符串,是一个char*型的容器。string封装了很多实用的成员方法查找
find,拷贝copy,删除erase,替换replace,插入insert......不用考虑内存释放和越界
string管理char*所分配的内存,每一次string的复制/赋值,取值都由string类负责维护,不用担心复制越界和取值越界等。
string本质上是一个动态的char数组。
string 容器常用操作
string 构造函数
string();
// 默认构造函数,创建一个空的字符串
string(const string& str);
// 拷贝构造函数,使用一个string对象初始化另一个string对象
string(const char* s);
// 含参构造函数,使用C风格字符串初始化
string(int n, char c);
// p含参构造函数,使用n个字符c初始化string 基本赋值操作
 = 赋值操作符
= 赋值操作符string& operator=(const char* s);
// C风格字符串赋值给当前的字符串
string& operator=(const string& s);
// 把字符串s赋给当前的字符串
string& operator=(const char c);
//字符赋值给当前的字符串 assign成员函数
assign成员函数string& assign(const char* s); 
// C风格字符串赋值给当前的字符串
string& assign(const char* s, int n); 
// 把C风格字符串s的前n个字符赋给当前的字符串
string& assign(const string& s); 
// 把字符串s赋给当前字符串
string& assign(int n, char c); 
// 把n个字符c赋给当前的字符串
string& assign(const string& s, int start, int n); 
// 将字符串s中从start开始的n个字符赋值给当前字符串string 存取字符操作
[]下标获取操作符
[]下标获取操作符char& operator[](int n); 
// 通过[]下标方式获取字符使用下标操作符获取字符时,如果下标越界,程序将会强制终止。
at成员函数
at成员函数char& at(int n); 
// 通过at方法获取字符使用at方法获取字符时,如果下标越界,at方法内部会抛出异常(exception),可以使用try-catch捕获并处理该异常。示例如下:
#include <stdexception> 
//标准异常头文件
#incldue <iostream>
using namespace std;
int main()
{
    string s = "hello world";
    try
    {
        //s[100]不会抛出异常,程序会直接挂掉
        s.at(100);
    }
    catch (out_of_range& e) 
        //如果不熟悉异常类型,可以使用多态特性, catch(exception& e)。
    {
        cout << e.what() << endl; 
        //打印异常信息
    }
    return 0;
}关于C++的异常处理用法可以查看相关教程了解,参考教程:
https://www.runoob.com/cplusplus/cpp-exceptions-handling.html
后续教程将默认读者了解C++异常处理的相关知识点。
string 拼接操作
+=复合操作符
+=复合操作符string& operator+=(const string& str); 
// 将字符串str追加到当前字符串末尾
string& operator+=(const char* str); 
// 将C风格字符数组追加到当前字符串末尾
string& operator+=(const char c); 
// 将字符c追加到当前字符串末尾
/* 上述操作重载了复合操作符+= */append成员函数
append成员函数string& append(const char* s); 
// 把C风格字符数组s连接到当前字符串结尾
string& append(const char* s, int n); 
// 把C风格字符数组s的前n个字符连接到当前字符串结尾
string& append(const string &s); 
// 将字符串s追加到当前字符串末尾
string& append(const string&s, int pos, int n); 
// 把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(int n, char c); 
// 在当前字符串结尾添加n个字符cstring 查找和替换
find成员函数
find成员函数int find(const string& str, int pos = 0) const; 
// 查找str在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
int find(const char* s, int n = 0) const; 
// 查找C风格字符串s在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
int find(const char* s, int pos, int n) const; 
// 从pos位置查找s的前n个字符在当前字符串中第一次出现的位置
int find(const char c, int pos = 0) const; 
// 查找字符c第一次出现的位置,从pos开始查找,pos默认为0当查找失败时,
find方法会返回-1,-1已经被封装为string的静态成员常量string::npos。static const size_t nops = -1;
rfind成员函数
rfind成员函数int rfind(const string& str, int pos = npos) const; 
// 从pos开始向左查找最后一次出现的位置,pos默认为npos
int rfind(const char* s, int pos = npos) const; 
// 查找s最后一次出现的位置,从pos开始向左查找,pos默认为npos
int rfind(const char* s, int pos, int n) const; 
// 从pos开始向左查找s的前n个字符最后一次出现的位置
int rfind(const char c, int pos = npos) const; 
// 查找字符c最后一次出现的位置replace成员函数
replace成员函数string& replace(int pos, int n, const string& str); 
// 替换从pos开始n个字符为字符串s
string& replace(int pos, int n, const char* s);
// 替换从pos开始的n个字符为字符串sstring 比较操作
compare成员函数
compare成员函数int compare(const string& s) const; // 与字符串s比较
int compare(const char* s) const; // 与C风格字符数组比较compare函数依据字典序比较,在当前字符串比给定字符串小时返回-1,在当前字符串比给定字符串大时返回1,相等时返回0。
比较操作符
bool operator<(const string& str) const;
bool operator<(const char* str) const;
bool operator<=(const string& str) const;
bool operator<=(const char* str) const;
bool operator==(const string& str) const;
bool operator==(const char* str) const;
bool operator>(const string& str) const;
bool operator>(const char* str) const;
bool operator>=(const string& str) const;
bool operator>=(const char* str) const;
bool operator!=(const string& str) const;
bool operator!=(const char* str) const;string类重载了所有的比较操作符,其含义与比较操作符本身的含义相同。
string 子串
substr成员函数
substr成员函数string substr(int pos = 0, int n = npos) const;
// 返回由pos开始的n个字符组成的字符串string 插入和删除操作
insert 成员函数
insert 成员函数string& insert(int pos, const char* s); // 在pos位置插入C风格字符数组
string& insert(int pos, const string& str); // 在pos位置插入字符串str
string& insert(int pos, int n, char c); // 在pos位置插入n个字符c返回值是插入后的字符串结果,
erase同理。其实就是指向自身的一个引用。
erase 成员函数
erase 成员函数string& erase(int pos, int n = npos); // 删除从pos位置开始的n个字符默认一直删除到末尾。
string 和 C-Style 字符串的转换
string 和 C-Style 字符串的转换string 转 const char*
string 转 const char*string str = "demo";
const char* cstr = str.c_str();const char* 转 string
const char* 转 stringconst char* cstr = "demo";
string str(cstr); // 本质上其实是一个有参构造和 string 相关的全局函数
注:有的可能需要C++11标准。
大小写转换
#include <cctype>
// 在iostream中已经包含了这个头文件,如果没有包含iostream头文件,则需手动包含cctype
int tolower(int c); // 如果字符c是大写字母,则返回其小写形式,否则返回本身
int toupper(int c); // 如果字符c是小写字母,则返回其大写形式,否则返回本身
/**
  * C语言中字符就是整数,这两个函数是从C库沿袭过来的,保留了C的风格
*/如果想要对整个字符串进行大小写转化,则需要使用一个for循环,或者配合和algorithm库来实现。例如:
#include <string>
#include <cctype>
#include <algorithm>
string str = "Hello, World!";
transform(str.begin(), str.end(), str.begin(), toupper); //字符串转大写
transform(str.begin(), str.end(), str.begin(), tolower); //字符串转小写字符串和数字的转换
int/double 转 string
int/double 转 stringc++11标准新增了全局函数
std::to_string,十分强大,可以将很多类型变成string类型。
#include <string>
using namespace std;
/** 带符号整数转换成字符串 */
string to_string(int val);
string to_string(long val);
string to_string(long long val);
/** 无符号整数转换成字符串 */
string to_string(unsigned val);
string to_string(unsigned long val);
string to_string(unsigned long long val);
/** 实数转换成字符串 */
string to_string(float val);
string to_string(double val);
string to_string(long double val);string 转 double / int
string 转 double / int#include <cstdlib>
#include <string>
using namespace std;
/** 字符串转带符号整数 */
int stoi(const string& str, size_t* idx = 0, int base = 10);
long stol(const string& str, size_t* idx = 0, int base = 10);
long long stoll(const string& str, size_t* idx = 0, int base = 10);
/**
  * 1. idx返回字符串中第一个非数字的位置,即数值部分的结束位置
  * 2. base为进制
  * 3. 该组函数会自动保留负号和自动去掉前导0
 */
/** 字符串转无符号整数 */
unsigned long stoul(const string& str, size_t* idx = 0, int base = 10);
unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10);
/** 字符串转实数 */
float stof(const string& str, size_t* idx = 0);
double stod(const string& str, size_t* idx = 0);
long double stold(const string& str, size_t* idx = 0);与之类似的在同一个库里的还有一组基于字符数组的函数如下。
// 'a' means array, since it is array-based. 
int atoi(const char* str); // 'i' means  int
long atol(const char* str); // 'l' means long
long long atoll(const char* str); // 'll' means long long
double atof(const char* str); // 'f' means double至此,读者应当详细了解了C++STL中string容器的各种用法以及其他一些字符串处理的常用函数。可能量有些大,无法一下子记住,可以暂时留个印象,待到使用时多翻一翻,慢慢就记住了。
最后更新于
这有帮助吗?