C++ Primer(顺序容器 下)

第九章 顺序容器

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

s1s2串接起来, 产生一个新的string对象

s1 += s2

s2拼接在s1的后面

关系操作符

相等运算(==和!=)以及关系运算(<<=>>=)都可用于string对象的比较,等效于(区分大小写的)字典次序的比较

上面是3.2节介绍的string类型,string还支持大多数顺序容器的操作,但不支持以栈方式操纵容器:不能使用front、back和pop_back操作。

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个字符

注意:nlen2pos2都是unsigned

char *cp="Hiya"; //末尾有空字符

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指向的元素之前插入迭代器be标记范围内所有的元素。返回void

s.assign(b, e)

用迭代器be标记范围内的元素替换s。对于string类型,该操作返回s;对于容器类型,则返回void

s.assign(n, t)

用值为tn个副本替换s。对于string类型,该操作返回s;对于容器类型,则返回void

s.erase(p)

删除迭代器p指向的元素。返回一个迭代器,指向被删除元素后面的元素

s.erase(b, e)

删除迭代器be标记范围内的所有元素。返回一个迭代器,指向被删除元素段后面的第一个元素

 

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的引用

s="some string";

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)

删除迭代器be标记的范围内所有的字符,用args替换之。返回s的引用

在这个版本中,args不能为s2, pos2, len2

 

9-18 appendreplace操作的参数:args

s2

string类型的字符串s2

s2, pos2, len2

字符串s2中从下标pos2开始的len2个字符

cp

指针cp指向的以空字符结束的数组

cp, len2

cp指向的以空字符结束的数组中前len2个字符

n, c

字符cn个副本

b2, e2

迭代器b2e2标记的范围内所有字符

append操作提供了字字符串尾部插入的捷径

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标记的位置开始,查找字符cpos的默认值为0

s2, pos

s中,从下标pos标记的位置开始,查找string对象s2pos的默认值为0

cp, pos

s中,从下标pos标记的位置开始,查找指针cp所指向的C风格的以空字符结束的字符串。pos的默认值为0

cp, pos, n

s中,从下标pos标记的位置开始,查找指针cp所指向数组的前n个字符。posn都没有默认值

1.精确匹配查找

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)

比较ss2

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)

比较scp所指向的以空字符结束的字符串

s.compare(pos1, n1, cp)

s中从pos1下标位置开始的n1个字符与cp所指向的字符串作比较

s.compare(pos1, n1, cp, n2)

s中从pos1下标位置开始的n1个字符与cp所指向字符串的前n2个字符作比较

fourth_ed.compare(fourth_ed.find("4th"),3,third_ed,third_ed("3th"),3);//比较 fourth_ed和third_ed的子字符串。

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,在基于优先级的适当位置插入新元素









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值