9.5.4 compare函数
s.compare函数根据s是等于、大于还是小于参数指定的字符串,返回0、正数或复数。
---------- | s.copmpare的几种参数形式 |
---|---|
s2 | 比较s1和s2 |
pos1,n1,s2 | 将s中pos1开始的n1个字符与s2进行比较 |
cp | 比较s与cp指向的以空字符结尾的字符数组 |
pos1,n1,cp | 将s中pos1开始的n1个字符与cp指向的以空字符结尾的字符数组比较 |
pos1,n1,cp,n2 | 将s中pos1开始的n1个字符与cp指向的地址开始的n2个字符进行比较 |
9.5.5 数值转换
字符串中常常包含表示数值的字符。一般情况下,一个数的字符不同于其数值。C++11标准引入了多个函数,可以实现数值数据与标准库string直接的转换。
---------- | string和数值之间的转换 |
---|---|
to_string(val) | 一组重载函数,返回数值val的string表示。val可以是任何算数类型。对每个浮点类型和int或更大的整型,都有相应版本的to_string与往常一样,小整型会被提升 |
stoi(s,p,b) | |
stol(s,p,b) | |
stoul(s,p,b) | |
stoll(s,p,b) | |
stoull(s,p,b) | 返回s的起始子串的数值,返回值类型分别是int、long、unsigned long、long long、unsigned long long。b表示转换所用的基数,默认值是10。p是size_t指针,用来保存s中第一个非数值字符的下标,p默认为0,即函数不保存下标 |
stof(s,p) | |
stod(s,p) | |
stold(s,p) | 返回s的起始子串的数值,返回类型分别是float、double、long double。参数p的作用与整数转换中一样 |
int i = 42;
string s = to_string(i); //将整数i转换为字符表示形式
double d = stod(s); //将字符串s转换为浮点数
要转换为数值的string中第一个非空白字符必须是数值中可能出现的字符。
string s2 = "pi = 3.14");
//转换s中以数字开始的第一个子串,结果d = 3.14
d = stod(s2.substr(s2.find_first_of("+-.0123456789")));
string参数中第一个非空白字符必须是符号(+或-)或数字。它可以以0x或0X开头来表示16进制数。对于那些将字符串转换为浮点值的函数,string参数也可以以小数点开头,并可以包含e或E来表示指数部分。对于那些将字符串转为整型值的函数,根据基数不同,string参数可以包含字母字符,对于大于数字9的数。
9.6 容器适配器
除了顺序容器,标准库还定义了三个顺序容器适配器:stack、queue、priority_queue。适配器是标准库中的一个通用概念。容器、迭代器和函数都有适配器。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型
---------- | 所有容器适配器都支持的操作和类型 |
---|---|
size_type | 一种类型,足以保存当前类型的最大对象的大小 |
value_type | 元素类型 |
container_type | 实现适配器的底层容器类型 |
A a; | 创建一个名为a的容器适配器 |
A a(c) | 创建一个名为a的容器适配器,带有容器c的一个拷贝 |
关系运算符 | 每个适配器都支持所有关系运算符:==、!=、<、>、>=、<= |
a.empty() | 若a包含任何元素,返回false,否则返回true |
a.size() | 返回a中元素数目 |
swap(a,b) a.swap(b) | 交换a和b的内容,a和b必须有相同类型,包括底层容器类型也必须相同 |
- 定义一个适配器
每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。
stack<int> stk(deq); //从deq拷贝元素到stk
默认情况stack和queue是基于deque实现的,priority_queue是基于vector实现的。在创建一个适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。
stack<string, vector<string>> str_strk; //在vector上实现的空栈
stack<string, vector<string>> str_stk2(svec);
对于一个给定的适配器,可以使用那些容器是有限制的。所有适配器都要求容器有添加和删除元素的能力,array、forward_list不能用来构造适配器。
- 栈适配器
stack类型定义在stack头文件中。
----- | 上表未列出的操作 |
---|---|
s.pop() | 删除栈顶元素,但不返回元素值 |
s.push(item) s.emplace(args) | 创建一个新元素压入栈顶,该元素通过拷贝或移动item而来,或者由args构造 |
s.top() | 返回栈顶元素 |
栈默认基于deque实现,也可以在list或vector上实现。
stack<int> intStack;
for(size_t ix = 0; ix != 10; ++i)
{
intStack.push(ix);
}
while(!intStack.empty())
{
int value = intStack.top();
intStack.pop();
}
每个适配器都基于底层容器类型的操作定义了自己的特殊操作。只可以使用适配器操作,不能使用底层容器类型的操作。例如deq.push()是错误的。
- 队列适配器
queue和priority_queue定义在queue头文件中。
----- | 上表未列出的操作 |
---|---|
q.pop() | 删除queue的首元素或priority_queue最高优先级的元素,但不返回此元素。 |
q.front() | 返回首元素或尾元素,但不删除此元素 |
q.back() | 只适用于queue |
q.top() | 返回最高优先级元素 |
q.push(item) q.emplace(args) | 在queue末尾或priority_queue中恰当的位置创建一个元素 |
queue默认基于deque实现,也可用list或vector实现。
priority_queue默认基于vector实现,也可以用deque实现