讲述,C++标准程序库中的字符串处理类 string
该类包含大量方法,包含若干构造函数,用于
字符串赋给变量
合并字符串
比较字符串
访问各个元素的重载操作符
查找字符和子字符串的方法,等。
C++从C继承的字符串概念,仍然以'\0'为结束符的char数组。
C++标准库中的 string class 可以将string作为一个型别,实现复制,赋值,比较,不必担心内存大小及占用内存实际长度等具体问题
当今世界,数据处理大部分还是字符串处理。
1 字符串简述
2 字符特点
3 字符串类(basic_string)
4 字符串通用函数
5 字符串联接
6 字符串IO操作
7 搜索
8 查找
9 字符串对迭代器的支持
0 字符串对配置器的支持
字符串简述
主要介绍:字符串类,和 智能指针 auto_ptr.
STL中只有一个字符串类,即 basic_string
basic_string 管理一个'\0'结尾的字符数组,字符类型由模板参数决定。
basic_string 被处理为不透明的对象,靠获得只读指针来访问缓冲区,写操作是由basic_string的成员函数实现的。
STL的C++标准程序库中的string类,使用时不必担心内存是否充足,字符串长度等问题。(why?)
在STL中,basic_string 有两个预定义类型:char的string类型,包含wchar的wstring类型。
string类的string::npos 可以同时定义字符串的最大长度,通常设置为无符号int的最大值。
String类,有6个构造函数。支持两种输入方式,cin , getline()
string stuff;
cin>>stuff;
grtline(cin,stuff);
STL中另外一个模板类:
auto_ptr 主要是管理动态内存分配。auto_ptr定义了类似指针的对象。将new获得的地址赋给该对象。
当auto_ptr对象过期时,析构函数将使用delete来释放内存。
将new返回的地址赋值给auto_ptr对象时,无须记住还需要释放这些内存,在auto_ptr对象过期时,内存将自动被释放。
使用auto_ptr,使用头文件<memory>,auto_ptr 是显式的,不存在从指针到auto_ptr对象的隐式类型转换。
auto_ptr<double> pd;
double *p_reg = new double;
pd = p_reg; //不允许
pd = auto_ptr<double>(p_reg); //允许
auto_ptr<double> pauto = p_reg; //不允许
auto_ptr<double> pauto(p_reg); //允许
只能对new分配的内存使用auto_ptr对象,不要对由new[]分配的或通过声明变量分配的内存使用它。
智能指针是一种类,即其对象的特征,类似于指针。智能指针,存储new分配的内存地址,也可以被解除引用。
智能指针是一个类对象,可以修改和扩充简单指针的行为。智能指针还可以建立引用计数,从而多个对象可以共享由智能指针跟踪的同一个值。
当使用该值的对象数为0时,智能指针将删除该值,智能指针可以提高内存的使用效率,帮助防止内存泄漏。
字符类型的性质由字符特征类(char_traits)定义。字符特征类是下述模板的专门化
template <class Ch> struct char_traits{}
所有字符特征类均定义在名称空间std中,标准的字符特征类由<string>给出。
通用字符串特征类char_traits本身无任何属性,针对特定字符类型的专门char_traits具有属性。
字符串类模板(basic_string模板类)
template<class Ch,class Tr=char_traits<Ch>,class A=allocator<Ch>>
class std::basic_string
{
public:
.............
}
模板声明中,三个参数,Ch,Tr,A
第一个参数,单个字符所属型别
第二个参数,特性类别,提供字符串类别中所有的字符核心操作,特性类别规定”复制字符“ 或”比较字符“的做法
第三个参数,定义字符串类别所采用的,内存模式
C++提供两种basic_string<>特化版本
typedef basic_string<char> string;
typedef basic_string<wchar> wstring;
basic_string<T>同样没有虚函数。
字符串操作的通用函数
构造函数 产生或复制字符串
析构函数 销毁字符串
=,assign 赋予新值
swap 交换两个字符串的内容
+=,append(),push_back() 添加字符
empty() 判断字符串是否为空
capacity() 返回重新分配之前的字符容量
reserve() 保留内存以存储一定数量的字符
[],at() 存取单一字符
>>,getline() 从stream中读取某值
insert() 插入字符
erase() 删除字符
clear() 移除全部字符
resize() 改变字符数量
replace() 替换字符
+ 串联字符串
==,!=,<,<=,>,>=,compare() 比较字符串内容
size(),length() 返回字符数量
max_szie() 返回字符的最大可能个数
<< 将值写入stream
copy() 将内容复制为一个C-string
c_str() 将内容以C-string形式返回
data() 将内容以字符数组形式返回
substr() 返回子字符串
find() 搜寻某子字符串或字符
begin(),end() 提供正向迭代器支持
rbegin(),rend() 提供逆向迭代器支持
get_allocator() 返回配置器
构造器函数,4个参数,其中3个是默认值
string strs;
string s(str);
string s(str,stridx);
string s(str,strbegin,strlen);
string s(cstr)
string s(cstr,char_len);
string s(num,c); //生成一个字符串,包含num个c字符
string s(strs,beg,end);
析构函数
~string()
std::string s(1,'x'); //正确
C_string 一般认为是常规的C++字符串,目前,存在一个从 const char* 到 string的隐式型别转换,却,
不存在从string对象到C_string的自动型别转换。
对于string类型的字符串,通过函数c_str()返回该string类对象对应的C_string。
字符串比较
compare()函数,比较运算符
类basic_string的函数compare()原型为:
int compare(const basic_string& s)const;
int compare(const Ch* p) const;
int compare(size_type pos,size_type n,const basic_string& s)const;
int compare(size_type pos,size_type n,const basic_string& s,size_type pos2,size_type n2)const;
int compare(size_type pos,size_type n,const Ch* p,szie_type n2=npos)const;
字符串内容修改和替换
assign(),operator=,erase(),swap,insert,append()
basic_string& assign(const E *s); //直接使用字符串赋值
basic_string& assign(const E *s,size_type n); //限定被初始化的字符长度
basic_string& assign(const basic_string& str,size_type pos,size_type n);
//将str的子串赋值给调用串
basic_string& assign(const basic_string& str); //使用字符串的”引用“赋值
basic_string& assign(size_type n,E c); //使用n个重复字符赋值
basic_string& assign(const_iterator first,const_iterator last); //使用迭代器赋值
erase()
函数原型:
iterator erase(iterator first,iterator last);
iterator erase(iterator it);
basic_string& erase(size_type p0 = 0,size_type n = npos);
str.erase(str.begin(),str.end());
str.erase(3);
void swap(basic_string& str);
insert()
basic_string& insert(size_type p0,const E *s);
basic_string& insert(size_type p0,const E *s,size_type n);
basic_string& insert(size_type p0,const basic_string& str);
basic_string& insert(size_type p0,const basic_string& str,size_type pos,size_type n);
basic_string& insert(size_type p0,size_type n,E c);
iterator insert(iterator it,E c);
void insert(iterator it,const_iterator first,const_iterator last);
void insert(iterator it,size_type n,E c);
append()函数
basic_string& append(const E *s);
basic_string& append(const E *s,size_type n);
basic_string& append(const basic_string& str,size_type pos,size_type n);
basic_string& append(const basic_string& str);
basic_string& append(size_type n,E c);
basic_string& append(const_iterator first,const_iterator last);
replace()函数
字符串IO操作
字符串的搜索和查找
本章总结:字符串必须掌握