STL--String类

string 类提供的各种操作函数大致分为八类:构造器和析构器、大小和容量、元素存取、字 符串比较、字符串修改、字符串接合、I/O 操作以及搜索和查找。


构造函数有四个参数,其中三个具有默认值。要初始化一个 string 类,可以使用 C 风格字符串或 string 类型对象,也可以使用 C 风格字符串的部分或 string 类型对象的部分或序列。

注意,不能使用字符或者整数去初始化字符串。

常见的 string 类构造函数有以下几种形式:

string strs //生成空字符串
string s(str) //生成字符串str的复制品
string s(str, stridx) //将字符串str中始于stridx的部分作为构造函数的初值
string s(str, strbegin, strlen) //将字符串str中始于strbegin、长度为strlen的部分作为字符串初值
string s(cstr) //以C_string类型cstr作为字符串s的初值
string s(cstr,char_len) //以C_string类型cstr的前char_len个字符串作为字符串s的初值
strings(num, c) //生成一个字符串,包含num个c字符
strings(strs, beg, end) //以区间[beg, end]内的字符作为字符串s的初值

析构函数的形式如下:

~string() //销毁所有内存,释放内存

如果字符串只包含一个字符,使用构造函数对其初始化时,使用以下两种形式比较合理:

std::string s('x'); //错误

std::string s(1, 'x'); //正确
std::string s("x"); //正确

C_string 一般被认为是常规的 C++ 字符串。目前,在 C++ 中确实存在一个从 const char * 到 string 的隐式型别转换,却不存在从 string 对象到 C_string 的自动型别转换。对于 string 类型的字符串,可以通过 c_str() 函数返回该 string 类对象对应的 C_string。

通常,程序员在整个程序中应坚持使用 string 类对象,直到必须将内容转化为 char* 时才将其转换为 C_string。

#include 
#include 
using namespace std;

int main ()
{
    string str ("12345678");
    char ch[ ] = "abcdefgh";
    string a; //定义一个空字符串
    string str_1 (str); //构造函数,全部复制
    string str_2 (str, 2, 5); //构造函数,从字符串str的第2个元素开始,复制5个元素,赋值给str_2
    string str_3 (ch, 5); //将字符串ch的前5个元素赋值给str_3
    string str_4 (5,'X'); //将 5 个 'X' 组成的字符串 "XXXXX" 赋值给 str_4
    string str_5 (str.begin(), str.end()); //复制字符串 str 的所有元素,并赋值给 str_5
    cout << str << endl;
    cout << a << endl ;
    cout << str_1 << endl;
    cout << str_2 << endl;
    cout << str_3 << endl;
    cout << str_4 << endl;
    cout << str_5 << endl;
    return 0;
}

1.赋值
=,assign()

string a;
a.assign("bbb");
string a="bbb";

从键盘赋值:
cin>>a;以空格作为结束
getline(cin,a);以回车作为结束

#include 
#include 
using namespace std;
int main()
{
    string str1 ("123456");
    string str;
    str.assign (str1); //直接赋值
    cout << str << endl;
    str.assign (str1, 3, 3); //赋值给子串
    cout << str << endl;
    str.assign (str1,2,str1.npos);//赋值给从位置 2 至末尾的子串
    cout << str << endl;
    str.assign (5,'X'); //重复 5 个'X'字符
    cout << str << endl;
    string::iterator itB;
    string::iterator itE;
    itB = str1.begin ();
    itE = str1.end();
    str.assign (itB, (--itE)); //从第 1 个至倒数第 2 个元素,赋值给字符串 str
    cout << str << endl;
    return 0;
}

2.交换两个字符串的内容
swap(string a,string b);

3.添加字符
a+=ba.append(string b);

4.插入字符
a.insert(位置下标,要插入的字符串);

5.删除字符
a.erase(要删除的字符的位置下标);
a.erase(要删除子串的起始位置下标, 子串的长度);

6.移除全部字符
赋空串a=""a.clear()//后者在VC6下不可以使用

7.改变字符串数量
resize()调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉;如果尺寸变大,不够的数据用该函数的第二个参数填充,因此会影响size()。
string a="jessy"; a.resize(10,'b');

8.替换字符串
a.replace(起始位置,长度,新的字符串)

9.串联字符串
+

10.比较字符串内容
== != < <= > >= compare()
a.compare(b)
如果在使用 compare() 函数时,参数中出现了位置和大小,比较时只能用指定的子串。例如:
s.compare {pos,n, s2);
若参与比较的两个串值相同,则函数返回 0;若字符串 S 按字典顺序要先于 S2,则返回负值;反之,则返回正值

#include 
#include 
using namespace std;
int main ()
{
    string A ("aBcdef");
    string B ("AbcdEf");
    string C ("123456");
    string D ("123dfg");
    //下面是各种比较方法
    int m=A.compare (B); //完整的A和B的比较
    int n=A.compare(1,5,B,4,2); //"Bcdef"和"AbcdEf"比较
    int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比较
    int q=C.compare(0,3,D,0,3); //"123"和"123"比较
    cout << "m = " << m << ", n = " << n <<", p = " << p << ", q = " << q << endl;
    cin.get();
    return 0;
}

11.返回字符数量
a.size() a.length()

12.返回字符的最大可能个数
a.max_size();

13.判断字符串是否为空
a.empty();

14.返回重新分配之前的字符容量
a.capacity()

15.保留内存以存储一定量的字符
a.reserve(大小)
并没有实际分配内存,影响capacity()

16.将内容复制为一个C-string
a.copy(p,n,size_type_Off=0);
从string对象中至多复制n个字符到字符指针p指向的空间中。默认从首字符开始。copy不会申请分配空间,所以用户要确保p指向的空间足够保存n个字符。

17.将内容以 C - string 形式返回
c_str();
返回一个指向某字符串的指针。

#include
#include
using namespace std;

int main()
{
    const char* b;
    string a="haha";
    b=a.c_str();
    cout<

18.将内容以字符数组形式返回
data()
与c_str()类似,但是返回的数组不以空字符终止。

#include
#include
using namespace std;

int main()
{
    const char* b;
    string a="haha";
    b=a.data();
    cout<

19.返回子字符串
a.substr(start,end);

20.搜寻某子字符串或字符

string str1,str2;
char c;

//从str1中查找str2,返回str2中首个字符在str1中的地址
str1.find(str2);
str1.find(str2,5);

//在str1中查找字符c并返回第一个查找到的地址
str1.find(c);

//在str1中的第2个字符开始查找str2的前两个字符,并返回str2的首字符在str1中的位置
str1.find(str2,2,2);

rfind() 函数的原型和find()函数的原型类似,参数情况也类似。只不过 rfind() 函数适用于实现逆向查找
find_first_of()函数可实现在源串中搜索某字符串的功能,该函数的返回值是被搜索字符串的第 1 个字符第 1 次出现的下标(位置)。若查找失败,则返回 npos。
find_last_of()函数同样可实现在源串中搜索某字符串的功能。与 find_first_of() 函数所不同的是,该函数的返回值是被搜索字符串的最后 1 个字符的下标(位置)。若查找失败,则返回 npos。
find_first_not_of() 函数可实现在源字符串中搜索与指定字符(串)不相等的第 1 个字符
find_last_not_of()函数可实现在源字符串中搜索与指定字符(串)不相等的最后 1 个字符。

你可能感兴趣的:(STL--String类)