Datahub
数据改变生活

STL-string

发表时间:2022-10-28 23:25

一、STL介绍

STL是标准模板库的简称。

可重用性:STL几乎所有代码用模板类和模板函数方式实现。

高性能:例如map采用红黑二叉树实现。

移植性:在项目A上用STL编写的模块可以移植到项目B上。

跨平台:用windows编写的代码可以在Mac OSXCode上直接编译。

二、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。比较区分大小写,参考字典序顺序。Aa小。

举例

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);   //此时iPos2,函数的第二个参数可不写

iPos = strA.find("lo ",0);    //此时iPos3,函数的第二个参数可不写

string strF = "el";   iPos = strA.find(strF,0);    //此时iPos1,函数的第二个参数可不写

iPos = strA.rfind('l',0);   //此时iPos2,函数的第二个参数可不写

iPos = strA.rfind("lo ",0); //此时iPos3,函数的第二个参数可不写

iPos = strA.rfind(strE,0); //此时iPos1,函数的第二个参数可不写

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. 替换

第一种方法调用WindowsAPI函数:WideCharToMultiByte()函数和MultiByteToWideChar()函数。

第二种方法使用ATLCA2W类与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);


文章分类: 算法学习
分享到:
QQ:258506508                                     联系电话:020-000000    000-000000                                   联系邮箱:xxx@.co.m                                     联系地址:XXX省XXX市XXX县XXX路