STL-string发表时间:2022-10-28 23:25 一、STL介绍 STL是标准模板库的简称。 可重用性:STL几乎所有代码用模板类和模板函数方式实现。 高性能:例如map采用红黑二叉树实现。 移植性:在项目A上用STL编写的模块可以移植到项目B上。 跨平台:用windows编写的代码可以在Mac OS的XCode上直接编译。
二、string 定义:STL的字符串类型。使用string之前,字符串通常用char*表示。 字符串string的使用方法:全面介绍了string类的构造、赋值、连接、比较、子串、查找、插入、删除、替换、wstring和统一编码等方面。 1. 使用之前: #include<string> using namespace std; 2. 构造函数 默认构造函数: string(); //构造一个空的字符串string s1 拷贝构造函数: string(const string &str);//构造一个与str一样的string。如string s1(s2) 带参数的构造函数: string(const char *s); //用字符串s初始化 string(int n,char c); //用n个字符c初始化 3. 提取字符 string s1=”..wikjaoisjdxiw”; char chA=s1[2]; //取第三个字符,越界会报错 char chD=s1.at(5); //取第六个字符,越界会抛出异常,如下 try{ char chE=s1.at(49); //Out of range } catch(...){ //越界能被catch捕捉到 } 存取字符操作: const char &operator[](int n) const; const char &at(int n) const; char &operator[](int n); //值可以被修改,如s1[4]=’X’,第五位改成字符X char &at(int n); 4. 拷贝到char*指向的内存空间 cout<<s1.c_str(); //string不能被cout接受,需要转换成char*类型 int copy(char *s,int n, int pos=0) const; 把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目。(注意s所指空间足够大,不然会越界) string strA=”helloworld”; char e[8]={0}; //申请空间 int iCount = strA.copy(e,7,0); //iCount==7 5. 取得长度和赋值 int length() const; //返回当前字符串的长度。不包括结尾’\0’ bool empty() const; //判断字符串是否为空 string &operator=(const string &s); //把字符串s赋给当前的字符串 string &append(const char *s); //把字符串s赋给当前字符串 string &append(const char *s,int n); //把字符串s的前n个字符赋给当前的字符串 string &append(const string &s); //把字符串s赋给当前字符串 string &append(int n,char c); //用n个字符c赋给当前字符串 string &append(const string &s,int start,int n); //把字符串s中从start开始的n个字符赋给当前字符串 举例 string strA(“world”); string strD(“Hello”); strD+=strA //strD的值为“Hello world” 或strD+=”world”; //strD的值为“Hello world” 或strD.append(“world”); //strD的值为“Hello world” 或strD.append(“world”,3); //strD的值为“Hello wor” 或strD.append(strA); //strD的值为“Hello world” 或strD.append(strA,0,3); //strD的值为“Hello wor” 或strD.append(5,’W’); //strD的值为“Hello WWWWW” 6. string的比较 int compare(string &s) const; //与字符串s比较 int compare(const char *s) const; //与字符串s比较 compare函数>时返回1,<时返回-1,==时返回0。比较区分大小写,参考字典序顺序。A比a小。 举例 string strA(“acdq”); string strB(“bab”); int iAB=strA.compare(strB); //iAB==-1; strA<strB 7. 取得字串 string substr(int pos=0,int n=npos) const; 返回由pos开始的n个字符组成的子字符串 string A(“Hello world!”); string strE = strA.substr(2,3); //此时strE内容为 "llo" 8. 查找 int find(char c,int pos=0) const; //从pos开始查找字符c在当前字符串的位置 int find(const char *s, int pos=0) const; //从pos开始查找字符串s在当前字符串的位置 int find(const string &s, int pos=0) const; //从pos开始查找字符串s在当前字符串中的位置 find函数如果查找不到,就返回-1 int rfind(char c, int pos=npos) const; //从pos开始从后向前查找字符c在当前字符串中的位置 int rfind(const char *s, int pos=npos) const; int rfind(const string &s, int pos=npos) const; //rfind是反向查找的意思,如果查找不到, 返回-1 举例: string A(“Hello w”); int iPos = strA.find('l',0); //此时iPos为2,函数的第二个参数可不写 iPos = strA.find("lo ",0); //此时iPos为3,函数的第二个参数可不写 string strF = "el"; iPos = strA.find(strF,0); //此时iPos为1,函数的第二个参数可不写
iPos = strA.rfind('l',0); //此时iPos为2,函数的第二个参数可不写 iPos = strA.rfind("lo ",0); //此时iPos为3,函数的第二个参数可不写 iPos = strA.rfind(strE,0); //此时iPos为1,函数的第二个参数可不写 9. 插入 string &insert(int pos, const char *s); string &insert(int pos, const string &s);//前两个函数在pos位置插入字符串s string &insert(int pos, int n, char c); //在pos位置 插入n个字符c string strF("abcdefg"); strF.replace(1,3,"xyzxyz"); //此时strF的内容为 "axyzxyzefg" 10. 删除和替换 string &erase(int pos=0, int n=npos); //删除pos开始的n个字符,返回修改后的字符串 string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入串s string &replace(int pos, int n, const string &s); //删除从pos开始的n个字符,然后在pos处插入串s void swap(string &s2); //交换当前字符串与s2的值
三、wstring 1.区别 string是对char*的管理,一个字符只占一个字节大小。一个汉字占两个字节,ASCII编码。 wstring是对wchar_t*的管理,一个字符占两个字节大小,一个汉字占两个字节,Unicode编码。 wstring的使用方法跟string类似,区别主要在于函数参数char*与函数参数wchar_t* 2. 替换 第一种方法:调用Windows的API函数:WideCharToMultiByte()函数和MultiByteToWideChar()函数。 第二种方法:使用ATL的CA2W类与CW2A类。或使用A2W宏与W2A宏。 第三种方法:跨平台的方法,使用CRT库的mbstowcs()函数和wcstombs()函数,需设定locale。 以下是第三种方法的实现例子。 #include <string> #include <locale.h> using namespace std; //wstring转成string string ws2s(const wstring &ws){ string curLocale = setlocale(LC_ALL,NULL); //curLocale="C"; setlocale(LC_ALL,"chs"); const wchar_t * _Source=ws.c_str(); size_t _Dsize=2*ws.size()+1; char * _Dest = new char[_Dsize]; memset(_Dest,0,_Dsize); wcstombs(_Dest,_Source,_Dsize); string result = _Dest; delete[] _Dest; setlocale(LC_ALL,curLocale.c_str()); return result; } //string转成wstring wstring s2ws(const string &s){ string curLocale = setlocale(LC_ALL,NULL); //curLocale = "C" setlocale(LC_ALL, "chs"); const char *_Source = s.c_str(); size_t _Dsize = s.size()+1; wchar_t *_Dest = new wchar_t[_Dsize]; wmemset(_Dest,0,_Dsize); mbstowcs(_Dest,_Source,_Dsize); wstring result = _Dest; delete[] _Dest; setlocale(LC_ALL, curLocale.c_str()); return result; } 3.编码统一化 如果我们想建立两个版本的程序,一个处理ASCII字符串,另一个处理Unicode字符串,最好的解决办法是编写出既能按ASCII编译又能按Unicode编译的单一源代码。把以下代码加入到程序中,只要修改一个宏就能满足我们的要求。 #ifdef _UNICODE typedef wstring tstring; typedef wchar_t tchar; #define _T(x) L ## x #else typedef string tstring; typedef char tchar; #define _T(x) x #endif 举例: tchar *pt = _T("HelloWorld"); tstring tstr(pt); tstring tstrSub = tstr.substr(2,3);
上一篇STL-vector
文章分类:
算法学习
|