马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
std::string详解
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。
标准模板库(STL)提供了一个std::string类,其是std::basic_string的一个特化,它是一个容器类,可把字符串当作普通类型来使用,并支持比较、连接、遍历、STL算法、复制、赋值等等操作,这个类定义在头文件中。#include //注意这里不是string.h string.h是C字符串头文件
实现原理
1.声明一个C++字符串,初始化
std::string类的构造函数声明一个字符串变量很简单:string Str;
这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:
- string s(); //生成一个空字符串s
- string s(str) //拷贝构造函数 生成str的复制品string(const string& str)
- string s(const char *s) //将C字符串作为s的初值
- string s(const char* cstr, size_type n) //使用字符串str的前n个字符初始化作为字符串s的初值。
- string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值
- string s(const string& str, size_type pos,strlen) //将字符串str内"始于pos且长度顶多strlen"的部分作为字符串的初值
- string s(int num,char c) //生成一个字符串,包含num个c字符
- string s(begin,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值,即迭代器间的值。
- s.~string() //销毁所有字符,释放内存
- 注意:当构造的string太长而无法表达时会抛出length_error异常
- 当指定拷贝的长度大于被拷贝字符串的长度时,是将字符串对应位置中剩余的内容全部拷贝。
2.字符串操作函数
1.赋以新值 = ,assign( )
第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s="gaint")甚至单一字符(如:s=’j’)。
还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。注意和string的构造初始化赋值等函数基本类似,只是这个是赋予新值。- s.assign(str);
- s.assign(str,1,3);//如果str是"iamangel" 就是把"ama"赋给字符串
- s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s
- s.assign("gaint");
- s.assign("nico",3);//把’n’ ‘I’ ‘c’赋给字符串
- s.assign("nicoafdad",2,5);//从二开始数五个
- s.assign(5,’x’);//把五个x赋给字符串
复制代码 2.两个字符串关系:交换swap( ) 比较字符串 ==,!=,< , , >= , ,compare( )
a.swap(b); //结果为 b="12345678"; a="ABCD";swap会导致迭代器失效
C ++字符串支持常见的比较操作符(>,>=, |