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实现