处理字符是整个编程遇到频率最多的事情,字符串包括字符,因此,有必要深入研究C++的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函数还提供反向查找。即在文本中采用自右向左, 自底向上