第九章 顺序容器
9.6再谈string类型
表9-12 普通的string操作 | |
string s; | 定义一个新的空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对象的比较,等效于(区分大小写的)字典次序的比较 |
9.6.1构造string对象的其他方法
表9-13 构造string对象的其他方法 | |
string s(cp, n) | 创建一个string对象,它被初始化为cp所指向数组的前n个元素的副本 |
string s(s2, pos2) | 创建一个string对象,它被初始化为一个已存在的string对象s2中从下表pos2开始的字符的副本 如果pos2 > s2.size(),则该操作未定义 |
string s(s2, pos2, len2) | 创建一个string对象,它被初始化为s2中从下标pos2开始的len2个字符的副本。如果pos2 > s2.size(),则该操作未定义 无论len2的值是多少,最多只能复制s2.sizeZ() – pos2个字符 注意:n、len2和pos2都是unsigned值 |
char c_array[]="world!!!";//末尾有空字符
char no_null[]={'H','i'};//末尾没有空字符
string s1(cp); //s1=="Hiya"
string s2(c_array,5); //s2=="world"
string s3(c_array+5,3); //s3=="!!!"
string s4(no_null); //runtime error: no_null not null-terminated
string s5(no_null,2); //s5=="Hi"
将其初始化为另一个string对象的子串
string s6(s1,2); //s6=="ya"
9.6.2修改string对象的其他方法
表9-14 与容器共有的string操作 | |
s.insert(p, t) | 在迭代器p指向的元素之前插入一个值为t的新元素。返回指向新插入元素的迭代器 |
s.insert(p, n, t) | 在迭代器p指向的元素之前插入n个值为t的新元素。返回void |
s.insert(p, b, e) | 在迭代器p指向的元素之前插入迭代器b和e标记范围内所有的元素。返回void |
s.assign(b, e) | 用迭代器b和e标记范围内的元素替换s。对于string类型,该操作返回s;对于容器类型,则返回void |
s.assign(n, t) | 用值为t的n个副本替换s。对于string类型,该操作返回s;对于容器类型,则返回void |
s.erase(p) | 删除迭代器p指向的元素。返回一个迭代器,指向被删除元素后面的元素 |
s.erase(b, e) | 删除迭代器b和e标记范围内的所有元素。返回一个迭代器,指向被删除元素段后面的第一个元素 |
表9-15 string类型特有的版本 | |
s.insert(pos, n, c) | 在下标为pos的元素之前插入n个字符c |
s.insert(pos, s2) | 在下标为pos的元素之前插入string对象s2的副本 |
s.insert(pos, s2, pos2, len) | 在下标为pos的元素之前插入s2中从下标pos2开始的len个字符 |
s.insert(pos, cp, len) | 在下标为pos的元素之前插入cp所指向数组的前len个字符 |
s.insert(pos, cp) | 在下标为pos的元素之前插入cp所指向的以空字符结束的字符串副本 |
s.assign(s2) | 用s2的副本替换s |
s.assign(s2, pos2, len) | 用s2中从下标pos2开始的len个字符副本替换s |
s.assign(cp, len) | 用cp所指向数组的前len个字符副本替换s |
s.assign(cp) | 用cp所指向的以空字符结束的字符串副本替换s |
s.erase(pos, len) | 删除从下标pos开始的len个字符 |
除非特殊声明,上述所有操作都返回s的引用 |
s2="some othen string";
s.insert(s.begin(),s2.begin(),s2.end());//从s的开头插入s2
s.insert(0,s2);//从s的0位置插入s2
s.insert(0,s2,0,s2.size());//在s的0位置之前插入从s2的0位置开始长度为s2.size的s2.
9.6.3只适用于string类型的操作
表9-16 字串操作 | |
s.substr(pos, n) | 返回一个string类型的字符串,它包含s中从下标pos开始的n个字符 |
s.substr(pos) | 返回一个string类型的字符串,它包含从下标pos开始到s末尾的所有字符 |
s.substr() | 返回s的副本 |
string s("hello world");
string s2=s.substr(6,5);//s2=world 从位置6开始的5个字符
string s3=s.substr(6);//s3=world 从位置6开始到末尾
表9-17 修改string对象的操作(args在表9-18中定义) | |
s.append(args) | 将args串接在s后面。返回s的引用 |
s.replace(pos, len, args) | 删除s中从下标pos开始的len个字符,用args指定的字符代替之。返回s的应用 在这个版本中,args不能为b2, e2 |
s.replace(b, e, args) | 删除迭代器b和e标记的范围内所有的字符,用args替换之。返回s的引用 在这个版本中,args不能为s2, pos2, len2 |
表9-18 append和replace操作的参数:args | |
s2 | string类型的字符串s2 |
s2, pos2, len2 | 字符串s2中从下标pos2开始的len2个字符 |
cp | 指针cp指向的以空字符结束的数组 |
cp, len2 | cp指向的以空字符结束的数组中前len2个字符 |
n, c | 字符c的n个副本 |
b2, e2 | 迭代器b2和e2标记的范围内所有字符 |
string s("C++ Primer");
s.append("3re Ed.");
replace操作用于删除一段指定范围的字符,然后在删除位置插入一组任意长度的新字符,等效于调用erase和insert函数
s.replace(11,3,"4th");//等效于下面两行
s.erase(11,3);
s.insert(11,"4th");
9.6.4string类型的查找操作
表9-19 string类型的查找操作(其参数args在表9-20中定义) | |
s.find(args) | 在s中查找args的第一次出现 |
s.rfind(args) | 在s中查找args的最后一次出现 |
s.find_first_of(args) | 在s中查找args的任意字符的第一次出现 |
s.find_last_of(args) | 在s中查找args的任意字符的最后一次出现 |
s.find_first_not_of(args) | 在s中查找第一个不属于args的字符 |
s.find_last_not_of(args) | 在s中查找最后一个不属于args的字符 |
表9-20 string类型提供的find操作的参数 | |
c, pos | 在s中,从下标pos标记的位置开始,查找字符c。pos的默认值为0 |
s2, pos | 在s中,从下标pos标记的位置开始,查找string对象s2。pos的默认值为0 |
cp, pos | 在s中,从下标pos标记的位置开始,查找指针cp所指向的C风格的以空字符结束的字符串。pos的默认值为0 |
cp, pos, n | 在s中,从下标pos标记的位置开始,查找指针cp所指向数组的前n个字符。pos和n都没有默认值 |
string name("Anna Belle");
string::size_type pos1=name.find("Anna");
2.指定查找的起点
string name("r2d2");
string numerics("0123456789");
string::size_type pos=0;
while((pos=name.find_first_of(numerics,pos))!=string::npos){
cout<<"found number of index:"<<pos<<"element is "<<name[pos]<<endl;
++pos;
}
9.6.5string对象的比较
表9-21 string类型的compare操作 | |
s.compare(s2) | 比较s和s2 |
s.compare(pos1, n1, s2) | 让s中从pos下标位置开始的n1个字符与s2作比较 |
s.compare(pos1, n1, s2, pos2, n2) | 让s中从pos1下标位置开始的n1个字符与s2中从pos2下标位置开始的n2个字符作比较 |
s.compare(cp) | 比较s和cp所指向的以空字符结束的字符串 |
s.compare(pos1, n1, cp) | 让s中从pos1下标位置开始的n1个字符与cp所指向的字符串作比较 |
s.compare(pos1, n1, cp, n2) | 让s中从pos1下标位置开始的n1个字符与cp所指向字符串的前n2个字符作比较 |
9.7容器适配器
使用适配器必须包含相关的头文件
#include<stack>
#include<queue>
表9-22 适配器通用的操作和类型 | |
size_type | 一种类型,足以存储此适配器类型最大对象的长度 |
value_type | 元素类型 |
container_type | 基础容器的类型,适配器在此容器类型上实现 |
A a; | 创建一个新的空适配器,命名为a |
A a(c); | 创建一个名为a的新适配器,初始化为容器c的副本 |
关系操作符 | 所有适配器都支持全部关系操作符:==、!=、<、<=、>、>= |
stack栈可以建立在vector、list或者deque容器之上
queue只能建立在list容器上
priority_queue提供随机访问功能,建立在vector或deque之上
表9-23 栈容器适配器支持的操作 | |
s.empty() | 如果栈为空,则返回true,否则返回false |
s.size() | 返回栈中元素的个数 |
s.pop() | 删除栈顶元素,但不返回其值 |
s.top() | 返回栈顶元素的值,但不删除该元素 |
s.push(item) | 在栈顶压入新元素 |
表9-24 队列和优先级队列支持的操作 | |
q.empty() | 如果队列为空,则返回true,否则返回false |
q.size() | 返回队列中元素的个数 |
q.pop() | 删除队首元素,但不返回其值 |
q.front() | 返回队首元素的值,但不删除该元素 该操作只适用于队列 |
q.back() | 返回队尾元素的值,但不删除该元素 该操作只适用于队列 |
q.top() | 返回具有最高优先级的元素值,但不删除该元素 该操作只适用于优先级队列 |
q.push(item) | 对于queue,在队尾压入一个新元素 对于priority_queue,在基于优先级的适当位置插入新元素 |