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 }
string构造

获取长度:

 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 }
string长度

判断是否为空:

 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 }
string是否为空

赋值操作:

 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 }
string赋值

存取操作:

 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 }
string存取

连接操作:

 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 }
string的连接

比较操作:

 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 }
string的比较

提取子串:

 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 }
string的子串

查找操作:

 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 }
string的查找

插入操作:

 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 }
string的插入

删除操作:

 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 }
string的删除

替换操作:

 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 }
string的替换

交换操作:

 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的交换

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 }
string与char*
posted @ 2019-12-23 17:07  SmallOverFllow  阅读(551)  评论(1编辑  收藏  举报