STL之string
一、介绍
1、STL是C++的一部分,做到了数据结构和算法的分离,具有高度的可重用性、高性能、高度的可移植性、跨平台的优点。
2、字符串string的使用方法:全面介绍了string类的构造、赋值、连接、比较、子串、查找、插入、删除、替换、wstring和统一编码等方面。
STL 简介:分为三类:container(容器)、iterator(迭代器)、algorithm(算法)。
它们之间的关系:
二、string 与 char* 异同
1 string是一个类,char*是一个指向char型的指针。
string封装了char*,管理这个字符串封装了char*,是一个char*型的容器,使用灵活性强便于功能扩展。
2 不用考虑内存释放和越界
String封装了char*,负责管理char*字符串,管理为char*所分配的内存。
每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。
3 string支持运算
重载运算符:
string a;string b;string c;
相加运算: c = a + b ;
比较运算:a > b, a != b;
4 能提供系列字符串操作函数
查找find,拷贝copy,删除delete
替换replace,插入insert
5 支持扩展
使用静态内存或者动态内存
使用资源ID加载字符串
操作安全使用锁
最本质的区别就是:string是一个类,char是基本类型,string封装了char。(此处出自http://www.cnblogs.com/bastard/archive/2012/01/07/2315885.html)
三、string 用法:
1.string的构造函数
默认构造函数: string s1; string s2;
拷贝构造函数: string s1(s2);
带参数的构造函数:string strA("daweige");string strB(5,'D');
2.string的存取字符操作
string strA("daweige");
char c = strA[2]; //调用 const char &operator[] (int n) const;
char d = strA.at(3); //调用 const char &at(int n) const;
strA[3] = 'E'; //调用 char &operator[] (int n);
strA.at(5) = 'G'; //调用 char &at(int n);
str.at(7)越界,抛出out_of_range异常, 可用try{}catch{}捕获
str[7] == (char)0,
str.at(8)越界,抛出out_of_range异常,可用try{}catch{}捕获
str[8]编译器直接报错,不可以用try{}catch{}捕获
从string取得const char*的操作
const char *cpch = str.c_str();
cpch[0] == 'd' cpch[1] =='a' cpch['7'] == '\0'
把string拷贝到char*指向的内存空间的操作
char e[8] = {0}; //申请空间
int iCount = strA.copy(e,7,0); //iCount==7
3.string的赋值
string strC;
strC = strA;
strC.assign("daweige");
strC.assign("daw");
strC.assign(strA);
strC.assign(5,'W');
strC.assign(strA,2,3);
4.string的连接
string strD("Hello ");
strD += strA; //此时strA内容为 "Hello daweige"
strD += "daweige";
strD.append("daweige");
strD.append("daweige", 3);
strD.append(strA);
strD.append(strA,0,3);
strD.append(5,'d');
string的子串:
string strE = strA.substr(2,3); //此时strE内容为 "wei"
5.string的查找
int iPos = strA.find('w',0); //此时iPos为2,函数的第二个参数可不写
iPos = strA.find("awe",0); //此时iPos为3,函数的第二个参数可不写
string strF = "aw"; iPos = strA.find(strF,0); //此时iPos为1,函数的第二个参数可不写
iPos = strA.rfind('w',0); //此时iPos为2,函数的第二个参数可不写
iPos = strA.rfind("eig",0); //此时iPos为3,函数的第二个参数可不写
iPos = strA.rfind(strE,0); //此时iPos为1,函数的第二个参数可不写
6.string的替换
string strF("abcdefg");
strF.replace(1,3,"xyzxyz"); //此时strF的内容为 "axyzxyzefg"
编码统一化,编写单一源代码
tchar *pt = _T("daweige");
tstring tstr(pt);
tstring tstrSub = tstr.substr(2,3);