C++学到深入一点,就应该大量的了解STL的知识,而这其中支撑的部分就是容器,顺序容器包括vector,list,deque等,如果善加利用,能够很大程度上提升程序的开发速度和效率,同时也减少了出问题的几率。
表9-1 顺序容器类型 | |
顺序容器 | |
vector | 支持快速随机访问 |
list | 支持快速插入/删除 |
deque | 双端队列 |
顺序容器适配器 | |
stack | 后进先出 (LIFO) 栈 |
queue | 先进先出 (FIFO) 队列 |
priority_queue | 有优先级管理的队列 |
表9-2 容器构造函数 | |
C<T> c; | 创建一个名为c的空容器。C是容器类型名,如vector,T是元素类型,如int或string。 适用于所有容器 |
C c(c2); | 创建容器c2的副本c;c和c2必须具有相同的容器类型,并存放相同的元素。适用于所有容器 |
C c(b, e); | 创建c,其元素是迭代器b和e标示的范围内元素的副本。适用于所有容器 |
C c(n, t); | 用n个值为t的元素创建容器c,其中值t必须是容器类型C的元素类型的值,或者是可转换为该类型的值 只适用于顺序容器 |
C c(n); | 穿件有n个值初始化 (value-initialized) 元素的容器c 只适用于顺序容器 |
表9-3 常用迭代器运算 | |
*iter | 返回迭代器iter所指向的元素的引用 |
iter->mem | 对iter进行解引用,获取指定元素中名为mem的成员。等效于(*iter).mem |
++iter | 给iter加1,使其指向容器里的下一个元素 |
iter++ | |
–iter | 给iter减1,使其指向容器里的前一个元素 |
iter– | |
iter1 == iter2 | 比较两个迭代器是否相等(不等)。当两个迭代器指向同一容器中的同一个元素,或者当它们都指向同一个容器的超出末端的下一位置时,两个迭代器相等 |
iter1 != iter2 |
表9-4 vector和deque类型迭代器支持的操作 | |
iter + n | 在迭代器上加(减)整数值n, 将产生指向容器中前面(后面)第n个元素的迭代器。新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一元素 |
iter – n | |
iter1 += iter2 | 这是迭代器加减法的符合赋值运算:将iter1加上或减去iter2的运算结果赋给iter1 |
iter1 -= iter2 | |
iter1 – iter2 | 两个迭代器的减法,其运算结果加上左边的迭代器即得左边的迭代器。这两个迭代器必须指向同一个容器中的元素或超出元素末端的下一位置 只适用于vector和deque容器 |
>, >=, <, <= | 迭代器的关系操作符。当一个迭代器指向的元素在容器中位于另一个迭代器指向的元素之前,则前一个迭代器小于后一个迭代器。关系操作符的两个迭代器必须指向同一个容器中的元素或超出容器末端的下一位置 只适用于vector和deque容器 |
表9-5 容器定义的类型别名 | |
size_type | 无符号整型,足以存储此容器类型的最大可能容器长度 |
iterator | 此容器类型的迭代器类型 |
const_iterator | 元素的只读迭代器类型 |
reverse_iterator | 按逆序寻址元素的迭代器 |
const_reverse_iterator | 元素的只读(不能写)逆序迭代器 |
difference_type | 足够存储两个迭代器差值的有符号整型,可为负数 |
value_type | 元素类型 |
reference | 元素的左值类型,是value_type&的同义词 |
const_reference | 元素的常量左值类型,等效于const value_type& |
表9-6 容器的begin和end操作 | |
c.begin() | 返回一个迭代器,它指向容器c的第一个元素 |
c.end() | 返回一个迭代器,它指向容器c的最后一个元素的下一个位置 |
c.rbegin() | 返回一个逆序迭代器,它指向容器c的最后一个元素 |
c.rend() | 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置 |
表9-7 在顺序容器中添加元素的操作 | |
c.push_back(t) | 在容器c的尾部添加值为t的元素。返回void类型 |
c.push_front(t) | 在容器c的前端添加值为t的元素。返回void类型 只适用于list和deque容器类型 |
c.insert(p,t) | 在迭代器p所指向的元素前面插入值为t的新元素。返回指向新添加元素的迭代器。 |
c.insert(p, n, t) | 在迭代器p所指向的元素前面插入n个值为t的新元素。返回void类型 |
c.insert(p, b, e) | 在迭代器p所指向的元素前面插入由迭代器b和e标记的范围内的元素。返回void类型 |
表9-8 顺序容器的大小操作 | |
c.size() | 返回容器c中的元素个数。返回类型为c::size_type |
c.max_size() | 返回容器c可容纳的最多元素个数。返回类型为c::size_type |
c.empty() | 返回标记容器大小是否为0的布尔值 |
c.resize(n) | 调整容器c的长度大小,使其能容纳n个元素 如果n<c.size(), 则删除多出来的元素; 否则,添加采用值初始化的新元素 |
c.resize(n, t) | 调整容器c的大小,使其能容纳n个元素。所有新添加的元素之都为t |
表9-9 访问顺序容器内元素的操作 | |
c.back() | 返回容器c的最后一个元素的引用。如果c为空,则该操作未定义 |
c.front() | 返回容器c的第一个元素的引用。如果c为空,则该操作未定义 |
c[n] | 返回下标为n的元素的引用 如果n<0或n>=c.size(),则该操作未定义 只适用于vector和deque容器 |
c.at(n) | 返回下表为n的元素的引用。如果下标越界,则该操作未定义 只适用于vector和deque容器 |
表9-10 删除顺序容器内元素的操作 | |
c.erase(p) | 删除迭代器p所指向的元素 返回一个迭代器,它指向被删除元素后面的元素。如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,则该函数未定义 |
c.erase(b, e) | 删除迭代器b和e所标记的范围内的所有元素 返回一个迭代器,它指向被删除元素段后面的元素。如果e本身就是指向超出末端的下一位置的迭代器,则返回的迭代器也指向容器的超出末端的下一位置 |
c.clear() | 删除容器c内的所有元素。返回void |
c.pop_back() | 删除容器c的最后一个元素。返回void。如果c为空容器,则该函数未定义 |
c.pop_front() | 删除容器c的第一个元素。返回void。如果c为空容器,则该函数未定义。 只适用于list和deque容器 |
表9-11 顺序容器的赋值操作 | |
c1 = c2 | 删除容器c1的所有元素,然后将c2的元素复制给c1。c1和c2的类型(包括容器类型和元素类型)必须相同 |
c1.swap(c2) | 交换内容:调用完该函数后,c1中存放的是c2原来的元素,c2中存放的则是c1原来的元素。c1和c2的类型必须相同。该函数的执行速度通常要比将c2的元素复制到c1的操作快 |
c.assign(b, e) | 重新设置c的元素:将迭代器b和e标记的范围内所有的元素复制到c中。b和e必须不是指向c中元素的迭代器 |
c.assign(n, t) | 将容器c重新设置为存储n个值为t的元素 |
表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-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值 |
表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的引用 |
表9-16 字串操作 | |
s.substr(pos, n) | 返回一个string类型的字符串,它包含s中从下标pos开始的n个字符 |
s.substr(pos) | 返回一个string类型的字符串,它包含从下标pos开始到s末尾的所有字符 |
s.substr() | 返回s的副本 |
表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标记的范围内所有字符 |
表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都没有默认值 |
表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-22 适配器通用的操作和类型 | |
size_type | 一种类型,足以存储此适配器类型最大对象的长度 |
value_type | 元素类型 |
container_type | 基础容器的类型,适配器在此容器类型上实现 |
A a; | 创建一个新的空适配器,命名为a |
A a(c); | 创建一个名为a的新适配器,初始化为容器c的副本 |
关系操作符 | 所有适配器都支持全部关系操作符:==、!=、<、<=、>、>= |
表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,在基于优先级的适当位置插入新元素 |