C++学习笔记(四): String 类

处理字符是整个编程遇到频率最多的事情,字符串包括字符,因此,有必要深入研究C++的string类


string类型所具有的操作
string s;
string  s(cp); 定义一个新的string对象,用cp所指向的(以空字符null结束的) c风格字符串初始化该对象
string s(s2);  定义一个新的string对象,并将它初始化为s2的副本

is >> s; 从输入流is中读取一个以空白字符分割的字符串, 写入s

os<<s;  将s写到输入流os中

getline(is, s) 从输入流is中读取一行字符,写入s

s1 + s2  将s1和s2串接起来,产生一个新的string对象

s1 += s2 将s2拼接在s1后面

关系操作符:  以字典次序的比较

除了以上操作,string类型还支持大多数顺序容器操作。  在某些方面,可将string类型视为字符容器
string类型提供与vector容器相同的操作。但,它不支持 以栈的方式操纵容器: 在string类型中不能使用  front、back和 pop_back操作

string支持的容器操作有
1   typedef,   包括迭代器类型
2   容器构造函数,不包括只需一个长度参数的构造函数
3   vector容器所提供的添加元素的操作。  不管是vector容器还是string类型都不支持push_front操作
4   长度操作 size()或resize()
5    下标和at操作。 但不提供back或front操作, back和front操作只有队列容器才提供
6    begin和end操作
7    erase和clear操作, 但是string类型不提供 pop_back或pop_front操作
8    赋值操作
9    与vector容器一样 string的字符也是连续存储的。  因此支持capacity和reserve


例:
string s("Hiya");
string::iterator iter=s.begin();
while(iter != s.end())
   cout<<*iter++<<endl;   //  postfix increment: print old value

构造string对象的其他方法

string对象除了不能接受只带参数n的初始化,vector的初始化它都支持, 其中不带参数的为空字符串

除了构造函数外,  string还提供接受指针或数组的初始化方式:
如:
char *cp= “Hiya”;
char c_array[]= "world!!!";
char no_null[]= {'H', 'i'};

string s1(sp);
由于构造函数自带了一个计数器,因此数组不必以空字符结束

string s2(c_array, 5); 这个 是以c_array的首地址也就是第一个地址开始,取出5个元素
string s3(c_array+5, 4);
string s4(no_null);   //这个是错误的,因为 它没有以 null结尾
string s5(no_null, 2); 这个输出的为2

如果是以string对象作为参数的话,那么初始化的方式有:
string s6(s1, 2);  表示从复制s1串中从第二个开始的字符;
string s7(s1, 0, 2);  表示复制从0开始,复制2个字符;
string s8(s1, 0, 8);  复制的长度最大只能为s1的长度

修改字符串的操作
主要提供了 插入(insert), 删除 (erase) 以及 赋值(assign) 等操作


只适用于string类型的操作

substr 函数, 返回当前string对象的子串
append 和 replace 函数, 用于修改string 对象
一系列 find 函数, 用于查找 string 对象

substr函数:
substr(pos, n); 这个pos既是下标 
substr(pos);  从某个部分开始,直到结尾
substr(); 这个表示整个字符串


append和replace函数

 string类型提供了6个 append重载函数版本和10个replace版本。  append和replace函数使用了相同的参数集合实现重载

对于append操作,字符将添加在string对象的末尾,而replace是在指定的地方插入字符。

append操作 为 s.append(args)  
replace 操作为 s.replace(pos, len, args);  s.replace(b, e, args);

string类型的查找操作
string 类提供了 6种 查找函数, 每种函数以不同形式的find命名。  这些操作全都返回 string::size_type类型的值,以小标形式标记查找匹配所发生的位置;
或者返回一个名为string::npos的特殊值, 说明查找没有匹配。  string类将npos定义为保证大于任何有效下标的值。


string一共提供两种查找方式: 一个是查找指定字符,一个是查找某个字符串的任意字符:
s.find(args);
s.rfind(args);  //  都是在s文本中查找args字符串,区别是,rfind是查找最后一个字符串

s.find_first_of(args);
s.find_last_of(args);// 这两个是 在s文本中查找任意字符的第一次出现,和最后一次出现。

s.find_first_not_of(args); 在s中查找第一个不属于args的字符
s.find_last_not_of(args): 在s中查找最后一个不属于args的字符

由于find操作时采用内置操作符比较string字符串中的字符,因此它是区分大小写的。
而且可以给查找指定一个起点, 这样查找过得地方,就不会再进一步被查找到。

例:
while( (pos=name.find_first_of(numerics, pos)) != string::npos)
{
     cout<<name[pos]<<endl;
     ++pos;
}


另外 string的find函数还提供反向查找。即在文本中采用自右向左, 自底向上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值