容器
顺序容器类型:
vector | 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 |
---|
deque | 双端队列。支持快速随机访问。在头尾位置插入/删除速度很快 | list | 双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快 | forward_list | 单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快 | array | 固定大小数组。支持快速随机访问。不能添加或删除元素 | string | 与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快 |
容器操作
| 类型别名 | |
| :------------------------------------ | --------------------------------------------------------- |
| iterator | 此容器类型的迭代器类型 |
| const_iterator | 可以读取元素,但不能修改元素的迭代器类型 |
| size_type | 无符号整数类型,足够保存此种容器类型最大可能容器的大小 |
| difference_type | 带符号整数类型,足够保存两个迭代器之间的距离 |
| value_type | 元素类型 |
| reference | 元素的左值类型;与value_type&含义相同 |
| const_reference | 元素的const左值类型(即,const value_type&) |
| 构造函数 | |
| C c; | 默认构造函数,构造空容器(array,参见第301页) |
| c c1(c2); | 构造c2的铂贝c1 |
| C c(b,e); | 构造c,将迭代器b和e指定的范围内的元素拷贝到c(array不支持) |
| C c{a,b,c...}; | 列表初始化c |
| 赋值与swap | |
| c1 = c2 | 将c1中的元素替换为c2中元素 |
| c1= {a,b,c...} | 将c1中的元素替换为列表中元素(不适用于array) |
| a.swap(b) | 交换a和b的元素 |
| swap(a,b) | 与a.swap(b)等价 |
| 大小 | |
| c.size() | c中元素的数目(不支持forward_list) |
| c.max_size() | c可保存的最大元素数目 |
| c.empty() | 若c中存储了元素,返回false,否则返回true |
| 添加/删除元素(不适用于array) | |
| 注:在不同容器中,这些操作的接口都不同 | |
| c.insert (args) | 将args中的元素拷贝进c |
| c.emplace (inits) | 使用inits构造c中的一个元素 |
| c.erase (args) | 删除args指定的元素 |
| c.clear () | 删除c中的所有元素,返回void |
| 关系运算符 | |
| ==,!= | 所有容器都支持相等(不等)运算符 |
| <,<=,>,>= | 关系运算符(无序关联容器不支持) |
| 获取迭代器 | |
| c.begin () , c.end () | 返回指向c的首元素和尾元素之后位置的迭代器 |
| c.cbegin (), c.cend () | 返回const_iterator |
容器定义和初始化
C c;
C c1(c2)
C c1=c2
C c{a, b,c...}
C c={a,b,c...)
C c(b, e)
只有顺序容器(不包括array)的构造函数才能接受大小参数
C seq(n)
c seq(n,t)
容器赋值运算
c1=c2
c={a,b,c. . . )
swap(c1,c2)
c1.swap(c2)
assign 操作不适用于关联容器和array
seq.assign (b,e)
seq.assign (il)
seq.assign (n, t)
向顺序容器添加元素的操作
这些操作会改变容器的大小;array不支持这些操作。
forward_list
forward_list
vector和string
c.push_back (t)
c.emplace_back (args)
c.push_front (t)
c.emplace_front (args)
c.insert(p,t)
c.emplace(p , args)
c.insert (p,n,t)
c.insert(p,b,e)
c.insert (p,il)
注意: 向一个vector.string或 deque插入元素会使所有指向容器的迭代器、引用和指针失效。
在顺序容器中访问元素的操作
at和下标操作只适用于string. vector. deque和array
back不适用于forward_list。
c.back ()
c.front ()
c [n]
c.at (n)
注意:对一个空容器调用 front和back,就像使用一个越界的下标一样,是一种严重的程序设计错误。
顺序容器的删除操作
这些操作会改变容器的大小,所以不适用于array。
forward_list
forward_list
c.pop_back ()
c.pop_front ()
c.erase (p)
c.erase (b, e)
c.clear ( )
注意:删除deque中除首尾位置之外的任何元素都会使所有迭代器、引用和指针失效。指向vector或string 中删除点之后位置的迭代器、引用和指针都会失效。
顺序容器大小操作
resize不适用于array
c.resize (n)
弃。若必须添加新元素,对新元素进行值初始化
C. resize(n, t)
注意:如果resize缩小容器,则指向被删除元素的迭代器、引用和指针都会失
效;对vector、string或deque进行resize可能导致迭代器、指针
和引用失效。
修改string的操作
s.insert (pos,args)
s.erase (pos,Ien)
s.assign (args)
s.append (args)
s.replace (range,args)
args可以是下列形式之一; append 和assign可以使用所有形式。
str不能与s相同,迭代器b和e不能指向s。
str
str, pos, len
cp, len
cp
n,c
b,e .
初始化列表 花括号包围的,以 逗号分隔的字符列表
string
初始化string对象的方式
string s1
string s2(s1)
string s2 = s1
string s3 ("value")
string s4(n, 'c')
n、len2和pos2都是无符号值
string s (cp,n)
包含n个字符
string S (s2, pos2)
string s (s2, pos2, len2)
子字符串操作
s.substr (PoS, n)
认值为0。n的默认值为s.size ()-pos,即拷贝从pos开始的所有字符
string的操作
os<<s
is>>s
getline(is, s)
s.empty ()
s.size ()
s[n]
s1+s2
sl=s2
s1==s2
s1!=s2
<,<=,>,>=
cctype头文件中的函数
isalnum(c)
isalpha(c)
iscntrl(c)
isdigit(c)
isgraph(c)
islower(c)
isprint (c)
ispunct (c)
isspace(c)
isupper(c)
isxdigit(c)
tolower (c)
toupper (c)
vector
初始化 vector对象的方法
vector<T> v1
vector<T> v2(v1)
vector<T> v2=v1
vector<T> v3(n,val)
vector<T> v4(n)
vector<T> v5{a,b,c...}
vector<T> v5 = { a,b,c.. . }
vector支持的操作
v .empty ()
v.size ()
v.push_back (t)
v [n]
v1 = v2
vl = {a,b,C... }
v1 == v2
vl != v2
<,<=,>,>=
迭代器
标准容器迭代器的运算符
*iter
iter->mem
++iter
--iter
iter1 == iter2
iter1 != iter2
vector和 string迭代器支持的运算
iter +n
iter - n
iter1 += n
iter1 -= n
iter1 - iter2
>、>=、<、<=
|