C++ String
写算法之余也插播最近一直没有停止学习C++,以前也用但是始终不是那么深入。
言归正传。
1概述
标准库类型string表示可变长的字符序列,使用前需要包含string头文件,并且string定义在命名空间std中。事实上,string类是basic_string<char>的一个typedef,即有下述语句:
typedef basic_string<char> string;
string类对象提供类似于标准容器的操作,不过是针对字符(char),例如在一些代码中可以看到对string对象调用size()方法来获取对象大小,它与length()方法的效果是一样的。
string s=”hello”
int len = s.size();
//len=5
关于string类的定义可以参考:
http://www.cplusplus.com/reference/string/string/
2.构造函数(提供6个构造函数)
a) string(const char*s)
将string对象初始化为s
例如:
string s(“hello”);
cout<<s<<endl;
//hello
b) string(size_type n,char c)
以n个字符c来初始化string的对象。
例如:
string s(5,’c’);
cout<<s<<endl;
//ccccc
c) string (const string& str, size_t pos=0, size_t len = npos)
拷贝构造函数,也可以指定索引位置开始
例如
string s1(“hello”);
string s2(s1);
//hello
string s3(s2,3);
//lo
注:索引值从0开始,这里的npos为构造函数参数,表示直到string对象的结尾。如果给定参数表示从pos开始子串的长度
string s("hello");
string s1(s,0,3);
cout << s1 << endl;
//hel
d) string()
默认构造函数,创建一个长度为0的string对象
例如:
string s;
cout<<s.size();
//0
e) string(const char*s,size_type n)
将string对象初始化为s指向的前n个字符,即使超过了其长度(但是结果会出现乱码)
f) template<class Iter>
string (Iter begin,Iter end)
注:范围是[begin,end),开区间不包括end
之前提到过string类提供类似容器的操作,所以可以进行如下初始化:
string s("hello");
string s1(s.begin()+3,s.begin()+5);
//lo
string s2(s.begin(),s.end());
//hello
3.操作符重载
这里重载了+,+=,<等符号,这个用的比较熟,就不多说了
4.find方法
提供find函数,但是有一点需要非常注意的就是下面一个表达式:
std::string::npos
这个值的定义如下:
static const size_t npos = -1
表示size_t的最大值。这个值是-1的原因是因为size_t表示无符号整数类型。
我们通常结合使用find()和npos来查询子串是否在母串中出现,这里如果不清楚size_t的类型及为什么npos=-1那么只需要记住,使用如下代码来做没找到匹配的判断:
if (str.find("abc") == string::npos)
{
//...
}
5.获取子串substr()
string substr (size_t pos = 0, size_t len = npos) const;
第一个参数表示子串的起始位置,第二个参数表示子串长度,如果没有给出第二个参数,将默认一直到母串尾。
参考:
https://www.byvoid.com/blog/cpp-string
写的非常详细。