《C++STL标准程序库开发指南》第二章,C++中的字符串

讲述,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操作
字符串的搜索和查找

本章总结:字符串必须掌握

发布了30 篇原创文章 · 获赞 5 · 访问量 2219

猜你喜欢

转载自blog.csdn.net/weixin_44408476/article/details/104876425