1.所有容器都支持的操作
(参考c++ primer 9:顺序容器)
1.1类型别名
操作 | 说明 |
---|
iterator | 此容器类型的迭代器类型 | const_iterator | 可以读取元素,但不能修改元素的迭代器类型 | size_type | 无符号整数类型,足够保存此种容器类型最大可能容器的大小 | different_type | 带符号整数类型,足够保存两个迭代器之间的距离 | value_type | 元素类型 | reference | 元素的左值类型;与value_type&含义相同 | const_reference | 元素的const左值类型(即,const value_type&) |
1.2构造函数
操作 | 说明 |
---|
C c; | 默认构造函数,构造空容器(array,参见第301页) | C c1(c2); C c1 = c2; | 构造c2的拷贝c1(两种方式等效) | C c(b,e); | 构造c,将迭代器b和e指定的范围内的元素拷贝到c(array不支持) | C c{a,b,c…}; C c = {a,b,c…}; | 列表初始化c(两种方式等效) |
1.3赋值与swap
warning:赋值相关运算会导致指向左边容器内部的迭代器、引用和指针失效。而swap操作将容器内容交换不会导致指向容器的迭代器、引用和指针失效(容器类型为array和string的情况除外)
操作 | 说明 |
---|
c1=c2 | 将c1中的元素替换为c2中元素 | c1={a,b,c,…} | 将c1中的元素替换为列表中元素(不适用于array) | a.swap(b) | 交换a和b的元素 | swap(a,b) | 与a.swap(b)等价 |
1.4大小
操作 | 说明 |
---|
c.size() | c中元素的数目(不支持forward_list) | c.max_size() | c可保存的最大元素数目 | c.empty() | 若c中储存了元素,返回false,否则返回true |
1.5添加/删除元素(不适用于array)
注:在不同容器中,这些操作的接口都不同
操作 | 说明 |
---|
c.insert(args) | 将args中的元素拷贝进c | c.emplace(inits) | 使用inits构造c中的一个元素 | c.erase(args) | 删除args指定的元素 | c.clear() | 删除c中所有元素,返回void |
1.6关系运算符
操作 | 说明 |
---|
==, != | 所有容器都支持相等(不等)运算符 | <, <=, >, >= | 关系运算符(无序关联容器不支持) |
1.7获取迭代器
操作 | 说明 |
---|
c.begin(), c.end() | 返回指向c的首元素和尾元素之后位置的迭代器 | c.cbegin(), c.cend() | 返回const_iterator |
1.8反向容器的额外成员(不支持forward_list)
操作 | 说明 |
---|
reverse_iterator | 按逆序寻址元素的迭代器 | const_reverse_iterator | 不能修改元素的逆序迭代器 | c.rbegin(), c.rend() | 返回指向c的尾元素和首元素之前位置的迭代器 | c.crbegin(), c.crend() | 返回const_reverse_iterator |
2.顺序容器
(参考c++ primer 9:顺序容器) 顺序容器类型:vector、deque、 list、 forward_list、array、 string
2.1顺序容器的构造函数补充
操作 | 说明 |
---|
C seq(n) | 默认值初始化 seq包含n个元素,这些元素进行了值初始化;此构造函数是explicit的(参见7.5.4节,第265页)。(string不适用) | C seq(n,t) | seq包含n个初始化值为t的元素 |
2.2顺序容器的赋值操作补充assign(不支持array)
操作 | 说明 |
---|
seq.assign(b,e) | 将seq中的元素替换为迭代器b和e所表示的范围中的元素。迭代器b和e不能指向seq中的元素 | seq.assign(il) | 将seq中的元素替换为初始化列表il中的元素 | seq.assign(n,t) | 将seq中的元素替换为n个值为t的元素 |
2.3向顺序容器添加元素的操作(不支持array)
注: forward_list 有自己专有版本的insert和emplace; 参见9.3.4节(第312页)。 forward_list 不支持push_back和emplace_back。 vector 和 string 不支持push_front 和emplace_front。
warning:向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用和指针失效
操作 | 说明 |
---|
c.push_back(t) c.emplace_back(args) | 在c的尾部创建一个值为t或由args创建的元素。返回void | c.push_front(t) c.emplace_front(args) | 在c的头部创建一个值为t或由args创建的元素。返回void | c.insert(p,t) c.emplace(p,args) | 在迭代器p指向的元素之前创建一个值为t或由args创建的元素。返回指向新添加的元素的迭代器 | c.insert(p,n,t) | 在迭代器p指向的元素之前插入n个值为t的元素。返回指向新添加的第一个元素的迭代器;若n为0,则返回p | c.insert(p,b,e) | 将迭代器b和e指定的范围内的元素插入到迭代器p指向的元素之前。b和e不能指向c中的元素。返回指向新添加的第一个元素的迭代器;若范围为空,则返回p | c.insert(p,il) | il是一个花括号包围的元素值列表。将这些给定值插入到迭代器p指向的元素之前。返回指向新添加的第一个元素的迭代器;若列表为空,则返回p |
2.4在顺序容器中访问元素的操作
注:at和下表操作只适用于string、vector、deque和array back不适用于forward_list。
操作 | 说明 |
---|
c.back() | 返回c中尾元素的引用。若c为空,函数行为未定义 | c.front() | 返回c中首元素的引用。若c为空,函数行为未定义 | c[n] | 返回c中下标为n的元素的引用,n是一个无符号整数。若n>=c.size(),则函数行为未定义 | c.at(n) | 返回下标为n的元素的引用。如果下标越界,则抛出一out_of_range异常 |
2.5顺序容器的删除操作(不支持array)
注:forward_list 有特殊版本的erase,参见9.3.4节(第312页)。 forward_list不支持pop_back;vector和 string 不支持pop_front。
warning:删除deque中除首尾位置之外的任何元素都会使所有迭代器、引用和指针失效。指向vector或string中删除点之后的迭代器、引用和指针都会失效。 删除元素的成员函数并不会检查其参数。在删除元素之前, 程序员必须确保它(们)是存在的。
操作 | 说明 |
---|
c.pop_back() | 删除c中尾元素。若c为空,则函数行为未定义。函数返回void | c.pop_front() | 删除c中首元素。若c为空,则函数行为未定义。函数返回void | c.erase( p ) | 删除迭代器p所指定的元素,返回一个指向被删元素之后的迭代器,若p指向尾元素,则返回尾后(off-the-end)迭代器。若p是尾后迭代器,则函数行为未定义 | c.erase(b,e) | 删除迭代器b和e所指定范围内的元素。返回一个指向最后一个被删元素之后元素的迭代器,若e本身就是尾后迭代器,则函数也返回尾后迭代器 | c.clear() | 删除c中所有元素。返回void |
2.6forward_list的插入和删除操作
操作 | 说明 |
---|
lst.before_begin() lst.cbefore_begin() | 返回首前迭代器,不能解引用 | lst.insert_after(p,t) | 返回一个指向插入元素的迭代器 | lst.insert_after(p,n,t) | 返回一个指向最后一个插入元素的迭代器 | lst.insert_after(p,b,e) | 返回一个指向最后一个插入元素的迭代器 | lst.insert_after(p.il) | 返回一个指向最后一个插入元素的迭代器 | emplace_after(p,args) | 略 | lst.earse_after( p ) lst.earse_after(b,e) | 返回一个指向被删元素之后元素的迭代器 |
2.7顺序容器的大小以及管理操作(略)
2.8额外的string操作(持更)
2.8.1构造string的方法
2.8.2子字符串操作
2.8.3修改string的操作
2.8.4string搜索操作
2.8.5compare操作
2.8.6string和数值之间的转换
2.9容器适配器
注:除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue。
2.9.1所有容器适配器都支持的操作和类型
操作 | 说明 |
---|
size_type | 一种类型,足以保存当前类型的最大对象的大小 | value_type | 元素类型 | container_type | 实现适配器的底层容器类型 | A a; | | A a?; | | 关系运算符==、!=、<、<=、>和>= | | a.empty() | | a.size() | | swap(a,b) | | a.swap(b) | |
2.9.2未列出的栈操作
注:栈stack默认基于deque实现,也可以在list或vector之上实现。
操作 | 说明 |
---|
s.pop() | 删除栈顶元素,但不返回该元素值 | s.push(item) s.emplace(args) | 创建一个新的元素压入栈顶,该元素通过拷贝或移动item而来,或者由args构造 | s.top() | 返回栈顶元素,但不将元素弹出栈 |
2.9.3未列出的queue和priority_queue操作
注:queue默认基于deque实现,priority_queue默认基于vector实现。 queue也可以用list或vector实现,priority_queue也可以用deque实现。
操作 | 说明 |
---|
q.pop() | 返回queue的首元素或priority_queue的最高优先级的元素,但不返回此元素 | q.front() q.back() | 返回首元素或尾元素,但不删除此元素(只适用于queue) | q.top() | 返回最高优先级元素,但不删除该元素(只适用于priority_queue) | q.push(item) q.emplace(args) | 在queue末尾或priority_queue中恰当的位置创建一个元素,其值为item,或者由args构造 |
3.关联容器
(参考c++ primer 11:关联容器) map、set、multimap、multiset、unordered_map、unordered_set、unordered_multimap、unordered_multiset
3.1关联容器额外的类型别名
操作 | 说明 |
---|
key_type | 此容器类型的关键字类型 | mapped_type | 每个关键字关联的类型;只适用于map | value_type | 对于set,与key_type相同 对于map,为pair<const_key_type, mapped_type> |
3.2关联容器添加删除操作
操作 | 说明 |
---|
c.insert(v) | v是value_type类型的对象;args用来构造一个元素 | c.emplace(args) | 函数返回一个pair,包含一个迭代器,指向具有指定关键字的元素,还有一个bool值 | c.insert(b,e) | 略 | c.insert(il) | 略 | c.insert(p,v) | 返回一个迭代器 | c.emplace(p,args) | 返回一个迭代器 | c.erase(k) | | c.erase§ | | c.erase(b,e) | |
3.3关联容器中的查找操作
注:lower_bound和upper_bound不适用于无序容器。 下标和at操作只适用于非const的map和unordered_map。
操作 | 说明 |
---|
c.find(k) | 返回迭代器 | c.count(k) | 返回int | c.lower_bound(k) | 返回一个迭代器,指向第一个关键字不小于k的元素 | c.upper_bound(k) | 返回一个迭代器,指向第一个关键字大于k的元素 | c.equal_range(k) | 返回一个迭代器pair,表示关键字等于k的元素的范围。若k不存在,pair的两个成员均等于c.end() |
3.4无序容器管理操作(略)
|