1.头文件包含:
一般来说使用string需要包含#include <string>头文件,但是下面的程序没有包含string头文件却能运行:

#include <iostream>

using namespace std;

int main()
{
      
string str("fdsfsdaf");

      cout 
<< str.c_str();     //str.c_str()可以运行
      
//cout << str;               //str无法运行

      
return 0;
}

不包含string头文件时,cout<<str无法运行;当重新包含string头文件后,cout<<str运行成功。为什么???
初步设想:iostream头文件间接导入了string头文件,但是相当一部分的string操作定义在string头文件中,例如程序中的<<操作符重载,不包含string头文件的话无法使用。所以建议编程时还是主动导入string头文件。

2.string类型声明:
string s;
string s(args);
其中args具体参数如下:
str
str, len
chars
chars, len
chars, index, len
n, c
b, e

注意:对string的操作,既可以用迭代器,也可以用下标,它比容器具有更多的灵活性。以下使用b、e和p表示迭代器,pos表示下标,cp表示指向c类字符串的指针。

3.string操作:
=、assign():
对string对象赋以新值。=右边可以是string类型、c_string类型甚至是'a'这样的单一字符。使用assign()可以更灵活的对string进行赋值,例如:
args具体参数如下:
str
str, len
chars
chars, len
chars, index, len
n, c
b, e

swap():
交换两个字符串的内容,例如s1.swap(s2),注意里面不可以是c_string类型。

+=、append(args)、push_back():
在尾部添加字符。+=后面可以是string、c_string甚至是'a'这样的单一字符。其中args具体参数如下:
str
str, len
chars
chars, len
chars, index, len
n, c
b, e
s.push_back('x')                    //用于每次增加一个字符。

insert():
在string某个位置插入字符,插入位置在给定的索引处。例如s.insert(4, str)。注意,这种形式的insert()函数不支持传入单个字符,要想传入单个字符必须写成字符串的形式。
s.insert(p, t)              //在p前插入元素t
s.insert(p, n, t)          //在p前插入n个t
s.insert(p, b, e)         //b和e是迭代器
s.insert(pos, args)
其中args具体参数如下:
str
str, len
chars
chars, len
chars, index, len
n, c
b, e

erase():删除字符。
s.erase(p)                //删除p指向的元素,返回指向该元素后面元素的迭代器
s.erase(b, e)            //删除b和e间的元素,返回指向该元素后面元素的迭代器
s.erase(pos, len)      //删除pos下标开始的len个字符

clear():
清空字符,例如s.clear(),效果等同于s="",但是内部机制是否一样未知。

replace():替换字符。
s.replace(pos, args)
其中args具体参数如下:
str
str, len
chars
chars, len
chars, index, len
n, c
b, e
同理把前两个参数换成b和e也可以。

+:
串联字符串。

==、!=、<、<=、>、>=、compare():
比较字符串,可以在string与string、string与c_string间进行比较,例如str1 < str2,s <= "abc"。compare()函数支持多参数处理,支持用索引值和长度定位子串来进行比较,返回0表示相等,正数表示大于,负数表示小于,例如:
s.compare("abcd")
s.compare(s2)
s.compare(pos, len, s2)
s.compare(pos1, len1, s2, pos2, len2)
s.compare(pos, len, "....")
s.compare(pos1, len2, "....", pos2, len2)

size()、length():
返回字符数量,两者等效。
empty():
判断字符串是否为空。
max_size():
返回字符的可能最大个数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。
capacity():
返回重新分配前的字符容量。
reserve():
重置字符容量。

[]、at():
存取单一字符,不同点在于at()会检查索引是否有效,即是否超出0~s.length()-1的范围,如果超出会抛出out_of_range的异常。

>>、getline():
从stream中读取某值,其中getline()是读取一行,直到遇到分行符或者文件结尾符。
<<:
将某值写入stream。

copy():
将某string写入一个既有的c_string中,例如s.copy(chars, s.size()),得到的字符串不以"\0"结尾,需要注意这点。
c_str():
函数原型是const char* c_str() const{},例如s.c_str()将返回一个const char*类型,且以"\0"结尾。
data():
函数原型是const char* data() const{},例如s.data()返回一个const char*类型,与c_str()不同的是它返回的字符串不以"\0"结尾。

substr():
返回某个子字符串。
s.substr()                 //返回s的全部内容
s.substr(pos)            //从pos下标开始的所有字符
s.substr(pos, len)     //从索引pos开始的len个字符。

begin()、end():
提供类似STL的迭代器支持。
rbegin()、rend():
逆向迭代器。
get_allocator():返回配置器。

查找函数:
find
rfind
find_first_of
find_last_of
find_first_not_of
find_last_not_of
参数1是被搜寻的对象,参数2指出搜寻起点索引(可无),参数3指出搜寻的字符个数(可无),返回值是索引值,类型是string::size_type,如果没有找到目标,返回string::npos。注意:string::npos的类型是string::size_type,并不是int而是unsigned int。
参数如下:
c, pos              //从pos下标开始查找字符c,pos可默认为0
s2, pos            //从pos开始查找string类型s2,pos可默认为0
cp, pos            //从pos开始查找字符串cp,pos可默认为0
cp, pos, len      //查找cp前n个字符,pos和len不可默认