C++ STL(一)介绍及string
STL: C++标准模板库的简称,它是C++的一部份。标准C++库的所有的标识符都是在一个名为std的命名空间中定义的
在使用STL中相关模板时,需要包含相关头文件,然后using namespace std;
注意:C++所用的头文件名是在C语言的相应的头文件名(但不包括后缀.h)之前加一字母c
例如,C语言中有关输入与输出的头文件名为stdio.h在C++中相应的头文件名为cstdio
STL分为四大类:
字符串(string) 容器(Container) 迭代器(iterator) 算法(algorithm)
使用STL的好处:
数据结构和算法的分离,高可重用性,高性能,高移植性,跨平台。
不需要思考STL内部具体实现过程,只要能熟练使用STL,这样就可以把精力专注于程序开发的其它方面。
高可重用性:STL中几乎所有代码都采用了模板类和模板函数的方式实现
高性能:如使用红黑树的map可以高效的从十万条记录里查找出指定的纪录
高移植性:在项目A中使用STL编写的模快,可以直接移植到项目B中
跨平台: 如在windows平台下使用vs编写的代码可以直接在任意系统上直接编译
---------------------------------------------------------------------------------------------------------------------------------------------
string是STL的字符串类型,用于存储以及处理各种字符串相关操作
使用string需要包含头文件 #include <string>
string.h 是c语言头文件
cstring 是c++头文件,提供C语言中对字符串处理的有关函数(如strcmp,ctrcpy)的声明
string 是C++中对字符串处理的新功能
string与char*的区别:
string 是STL中一种封装好的字符串类型,由系统负责内存管理
char* 是指向字符数组的一个指针,需要手动进行内存管理,容易出现内存泄露
构造函数:
1 //string构造 2 void StringStructure() 3 { 4 string str1; //默认构造一个空的字符串 5 6 //string(const char*) 7 string str2("abc"); //用char*构造str2 (str2="abc") 8 //string(const string&) 9 string str3(str2); //用另一个string对象构造str3 (str3=str2) 10 //string(int n,char c) 11 string str4(5,'a'); //用5个'a'来构造str4 (str4="aaaaa") 12 //string(const char* s, int n) 13 string str5("Hello",3); //用s的前n个字符来构造str5 (str5="Hel") 14 15 string str6 = "Hello";//str6="Hello" 16 //string(string s,int nPos,int n) 17 string str7(str6,2,3);//用s的nPos位置开始的n个字符来构造str7(str7="llo") 18 19 return; 20 }
获取长度:
1 //string长度 2 void StringLeng() 3 { 4 string str = "abc"; 5 int nLeng = str.length(); //nLeng = 3 6 int nSize = str.size(); //nSize = 3 7 8 //二者是相同的功能,都是返回字符串的长度 9 return; 10 }
判断是否为空:
1 //string是否为空 2 void StringEmpty() 3 { 4 //二者都可以用来判断是否为空 5 //前者使用empty方法,后者使用重载的==号操作符 6 string str; 7 bool bEmpty = str.empty(); //true 8 bool bEmpty_1 = str == ""; //true 9 10 str = "aaa"; 11 bEmpty = str.empty(); //false 12 bEmpty_1 = str.empty(); //false 13 14 return; 15 }
赋值操作:
1 //string赋值 2 void StringAssign() 3 { 4 string str = "abc"; //使用常量字符串赋值 5 string str1 = str; //使用另一个string进行赋值 6 char szBuff[] = "abc"; 7 string str2 = szBuff; //使用一个字符数组进行赋值 8 char* pStr = "123"; 9 string str3 = pStr; //使用一个字符串指针进行赋值 10 //使用assig()进行赋值 11 string str4; 12 str4.assign("abc"); //使用字符常量的指针赋值 (str4=abc) 13 str4.assign(str3); //使用另一个string进行赋值 (str4=123) 14 str4.assign("Hello",3); //使用字符串的前三个字符进行赋值 (str4=Hel) 15 str4.assign(str3,1,2); //使用str3中下标为1开始的2个字符进行赋值 (str4=23) 16 str4.assign(5,'a'); //使用5个字符a进行赋值 (str4=aaaaa) 17 18 return; 19 }
存取操作:
1 //string存取 2 void StringAccess() 3 { 4 string strA("abcdef"); 5 //使用数组下标方式存取string 6 char ch = strA[3];//取字符串下标为3的元素赋值给ch, (ch = 'd') 7 strA[0] = '1'; //用字符修改字符串下标为0的元素,strA="1bcdef" 8 //注意:使用数组[]方式访问,超出范围会产生断言错误 9 char chError = strA[99]; //error:out of range 10 11 //使用.at存取string 12 char ch1 = strA.at(3); //ch1= 'd' 13 strA.at(0) = '1'; //strA="1bcdef" 14 //注意:使用at()方式访问,超过范围会抛出异常 15 char chError1 = strA.at(99); 16 17 return; 18 }
连接操作:
1 //string的连接 2 void StringAppend() 3 { 4 //使用+=连接 5 string str = "Hello"; 6 str += " word"; //与const char*连接 (str="Hello word") 7 string str1 = " !"; 8 str += str1; //与string连接(str="Hello word !") 9 10 //使用append往字符串后面追加数据 11 string strA = "Hello,"; 12 strA.append(" word");//append一个const char* //(str="Hello, word") 13 string strB = "!"; 14 strA.append(strB); //append一个string (str="Hello, word!") 15 16 string strC = "Hello, "; 17 string strD = "Hello, word "; 18 strC.append(strD,7,5);//以strD的pos位置为7开始的5个字符追加到strC中(strC="Hello, word ") 19 strC.append(3,'!'); //append三个字符! (strC=Hello, word !!!) 20 21 return; 22 }
比较操作:
1 //string的比较 2 void StringCompare() 3 { 4 //使用compare比较二个字符串的大小 5 //1.逐一取出二个字符串相应位置的字符进行比较,如果不相等就返回比较结果, 6 //相等的话就取下一个字符接着比较 7 //2.比较规则,根据字符的ascii码值进行比较,小写字母比大写字母的ascii码大 8 //3.第一个字符串大于第二个字符串,返回1。小于返回-1, 二者相同返回0 9 10 string strA = "abcd"; 11 string strB = "abcd"; 12 string strC = "Abcd"; 13 string strD = "aacd"; 14 15 int nAB = strA.compare(strB); //strA和strB相同返回0 (nAB = 0) 16 int nBC = strB.compare(strC); //strB的第一个字符'a'比strC的第一个字符'A'大,返回结果1 (nBC=1) 17 int nDA = strD.compare(strA); //strD与strA第一个字符都为'a',判断下一个字符.strD的字符'a'小于strA的字符'b', 18 //结果为-1 (nDA=-1) 19 20 //使用重载运算符== < > 比较 21 bool bAB = strA == strB; //二者相同,返回真 22 bool bBC = strB > strC; //B大于C,也是返回真 23 bool bDA = strD < strA; //D小于A,也是返回真 24 25 //compare返回的是整数,重载运算符返回的是布尔值,相比而言后者结果更加直观 26 27 return; 28 }
提取子串:
1 //string的子串 2 void StringSubStr() 3 { 4 //使用substr 5 string str("Hello"); 6 string strA = str.substr(2); //取得str中pos位置为2开始的所有字符串,返回string (strA="llo") 7 string strB = str.substr(2,3); //取得str中pos位置为2开始的后面3个字符,返回string (strA="llo") 8 9 return ; 10 11 }
查找操作:
1 //string的查找 2 void StringFind() 3 { 4 //使用find(正向查找,从字符串第一个字符开始向后查找第一次出现的位置)返回pos 5 string str = "Hello"; 6 int nPos = str.find('l'); //查找字符'l'在字符串中第一次出现位置 (nPos = 2) 7 int nPosA = str.find("lo");//查找字符串"lo"在字符串中的位置 (nPos = 3) 8 9 //使用rfind(反向查找,从字符串最后一个字符开始向前查找)返回pos 10 int nPosB = str.rfind('l'); //字符串中有二个l,rfind是从后往前找,//所以找到的是 11 //最后一个l在字符串上的位置.(nPosB = 3) 12 int nPosC = str.rfind("lo");//查找字符串"lo"在字符串中的位置 (nPos = 3) 13 14 //注意:不论是find还是rfind,返回pos都是被查询字符或字符串在源字符串中从左到右数的下标 15 return; 16 }
插入操作:
1 //string的插入 2 void StringInsert() 3 { 4 //使用insert(在指定pos前面插入字符或字符串) 5 string str = "abc"; 6 str.insert(1,5,'1'); //在pos为1的字符'b'前面插入五个字符'1' (str = "a11111bc") 7 str.insert(0,"66"); //在pos为0的字符'a'前面插入字符串"66" (str = "66a11111bc") 8 9 return; 10 }
删除操作:
1 //string的删除 2 void StringErase() 3 { 4 //使用erase(删除指定pos位置开始后面的字符或字符串) 5 string str = "abcdf110"; 6 str.erase(5); //删除pos为5开始的后面所有字符 (str = abcdf) 7 string strA = "abcdf110"; 8 strA.erase(5,2); //删除pos为5开始的后面2个字符 (str = abcdf0) 9 10 return; 11 }
替换操作:
1 //string的替换 2 void StringReplace() 3 { 4 //使用replace(用另一个字符串替换pos位置开始的指定长度的字符串) 5 //1.先删除pos位置开始的指定长度的字符串 6 //2.把用于替换的字符串插入到(pos位置+1到pos+替换的字符数之间)的位置,组合成新的字符串 7 string str = "abca"; 8 str.replace(1,2,"6666"); //删除pos为1开始的2个字符"bc",剩余"aa",然后在 9 //第一个'a'与最后一个'a'之间插入替换的字符串"6666". (str = "a6666a") 10 return; 11 }
交换操作:
1 //string的交换 2 void StringSwap() 3 { 4 //使用swap(把二个字符串中的数据进行相互交换) 5 string strA = "abc"; 6 string strB = "123"; 7 strA.swap(strB); //(strA = "123") (strB = "abc") 8 9 return ; 10 }
string与char*
1 //string与char* 2 void StringToCharArray() 3 { 4 string str("abc"); 5 //通过c_str()方法返回一个const char* 6 const char* pCh = str.c_str(); 7 cout<<pCh<<endl; 8 cout<<str.c_str()<<endl; 9 10 //通过copy拷贝字符串到char*所指向的字符数组空间 11 //int copy(char* dest,int count, int pos=0) 返回值是实际拷贝的数目,pos默认为0 12 //注意:dest需要有足够大的缓冲区,否则会越界 13 char szStr[10] = {0}; 14 char szStr1[10] = {0}; 15 int nNum = str.copy(szStr,2); //拷贝str中前二个字符 szStr="ab" nNum=2 16 int nNum1= str.copy(szStr1,2,1); //从str下标1位置开始拷贝2个字符到szStr中,szStr1="bc" 17 18 return; 19 }