1. 泛型算法(通过迭代器来间接操作容器)
标准库的容器操作 很少,标准库虽然没有给每个容器 添加很多功能,但是提供了一组算法。
算法是独立于容器的、通用的(同一个算法,可用于不同类型的容器、不同类型的元素)
例如 find算法
find ( vec.begin() , vec.end() , val ) 在容器vec中,查找val元素
2. 迭代器(访问容器对象 元素)
在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。
所有标准库容器都支持迭代器
和指针 相同点 | 和指针 不同点 | |
---|---|---|
都支持运算符移动 | 指针:取地址&返回 迭代器:通过成员函数 begin()、end() 返回 | |
指针:指向 内存单元 迭代器:指向 容器中元素 | ||
都通过 解引用 *iter 获取指向的元素 |
迭代器类型
标准库类型,用 iterator、const_iterator 表示迭代器类型:
vector<int>:: iterator it; // 读写迭代器
string:: iterator it;
vector<int>:: const_iterator it; // 只读 迭代器
string:: const_iterator it;
迭代器运算符
*iter | 返回迭代器iter所指元素的引用 |
---|---|
iter -> member | 解引用iter 并获取该元素的成员member |
++iter | 令迭代器指向 容器的下一个元素 |
--iter | 令迭代器指向 容器的上一个元素 |
iter1 == iter2 | 判断两个迭代器是否相等 |
iter1 != iter2 |
3. 容器
------------所有容器------------
容器构造、初始化
操作 | 说明 | 不支持容器 |
---|---|---|
C<T> c1; | 默认构造函数 | |
C<T> c1(c2); C<T> c1 = c2; | c1初始化为c2的拷贝(必须是相同类型) | |
C<T> c {a, b, c}; C<T> c = {a, b, c}; | 初始化列表 | |
C<T> c(b, e); | 迭代器b、e范围元素内的拷贝 | |
C<T> seq(n); 接收大小参数 | 顺序容器对象seq 包含n个元素 | 仅顺序容器(array除外) |
C<T> seq(n,val);接收大小参数 | 顺序容器对象seq 包含n个值为val元素 | 仅顺序容器(array除外) |
赋值
赋值适用于所有容器,赋值后 两者大小 都为 右边容器的大小。
操作 | 说明 | 不支持容器 |
---|---|---|
c1 = c2; | ||
c = {a, b, c ……} | array |
swap 交换元素
操作 | 说明 | 不支持容器 |
---|---|---|
swap(c1,c2) | ||
c1.swap(c2) | array |
替换(仅顺序容器)
操作 | 说明 | 不支持容器 |
---|---|---|
seq.assign(b, e) | 将顺序容器seq的元素,替换为,迭代器b、e范围内的元素 | 关联容器、array |
seq.assign(i1) | 替换为 初始化列表i1的元素 | 关联容器、array |
seq.assign(n, val) | 替换为n个val的元素 | 关联容器、array |
容器大小 size()
每个容器类型,都有3个与大小有关的操作
操作 | 说明 | 不支持容器 |
---|---|---|
c.size() | 元素数目 | forward_list |
c.max_size() | 可保存的最大元素数目 | |
c.empty() | 是否空容器。返回ture、false |
迭代器获取
操作 | 说明 | 不支持容器 |
---|---|---|
c.begin() c.end() | 指向c首、尾元素之后位置的迭代器 | |
c.cbegin() c.cend() | const_iterator | |
c.rbegin() c.rend() | 指向c尾元素、首元素之前位置的迭代器 | |
c.crbegin() c.crend() | const_reverse_iterator |
------------顺序容器--------------
所有顺序容器,都支持 顺序访问元素 (≠ 随机访问)
顺序容器,几乎可以保存 任意类型的 元素,元素类型是容器类型 也可以
选取原则
-
默认选择—— vector
-
快速随机访问—— vector、deque
-
在中间 插入、删除元素—— list、forward_list
-
在头尾、不在 中间 插入、删除元素 —— deque
1. vector(可变数组)
元素保存在连续的 内存空间,连续存储
支持 | 缺点 |
---|---|
快速随机访问 | 在中间位置 插入、删除 元素 非常耗时,需要移动位置之后所有元素, 可能还要分配额外的存储空间(每个元素移动到新的存储空间) |
快速在尾部插入、删除元素 |
2. deque(双端队列)
支持 | 缺点 |
---|---|
快速随机访问 | 在中间位置 插入、删除 元素非常耗时 |
快速在头部、尾部插入、删除元素 |
####
3. list(双向链表)
优点 | 缺点 |
---|---|
双向 顺序访问 | 不支持元素 随机访问,访问1个元素只能遍历整个容器 |
在 任何位置 插入、删除 很快 | 额外内存开销大 |
####
4. forward_list(单向链表)
优点 | 缺点 |
---|---|
单向 顺序访问 | 不支持元素 随机访问,访问1个元素只能遍历整个容器 |
在 任何位置 插入、删除 很快 | 额外内存开销大 |
####
5. array(固定数组大小)
优点 | 缺点 |
---|---|
快速随机访问 | 不能 插入、删除元素(array大小固定) |
不能 改变容器大小 |
####
6. string (类似vector)
元素保存在连续的 内存空间
支持 | 缺点 |
---|---|
快速随机访问 | 在中间位置 插入、删除非常耗时,需要移动位置之后所有元素, 可能还要分配额外的存储空间(每个元素移动到新的存储空间) |
快速在 尾部 插入、删除元素 |
string额外操作
构造
专有操作 | 说明 |
---|---|
string s1(cp,n) | cp指向数组中 前n个字符的拷贝 |
string s1(s2,pos2) | s2从下标pos开始的字符拷贝 |
string s1(s2,pos2,len2) | s2从下标pos开始的,len个字符的拷贝 |
substr操作
专有操作 | 说明 |
---|---|
s.substr(pos,n) | s中从pos开始的n个字符的拷贝。 pos默认为0 |
插入、删除、替换、追加
专有操作 | 说明 |
---|---|
s.insert(pos,args) | 在pos之前,插入args指定的字符 |
s.erase(pos,len) | 删除从pos开始的len个字符 如果len省略,则删除到末尾 |
s.assign(args) | 替换为args指定的字符 |
s.append(args) | 将args追加到s末尾 |
s.replace(range,args) | 删除s中范围range内的字符,替换为args指定的字符 |
搜索
专有操作 | 说明 |
---|---|
s.find(args) s.rfind(args) | 查找s中args第一次出现的位置 查找s中args最后一次出现的位置 |
s.find_first_of(args) s.find_last_of(args) | 在s中查找 args中任何一个字符 第一次出现的位置 在s中查找 args中任何一个字符 最后一次出现的位置 |
s.find_first_not_of(args) s.find_last_not_of(args) |
顺序容器 共同操作
添加元素(array不支持)
操作 | 说明 | 不支持容器 |
---|---|---|
c.push_back(t) c.emplace_back(args) | 在c的尾部 添加一个元素(值为t 、参数args),返回void | array、forward_list |
c.push_front(t) c.emplace_front(args) | 在c的头部 添加一个元素(值为t 、参数args),返回void | string、array、vector |
c.insert(p, t) c.emplace(p, args) | 迭代器p指向元素,之前位置插入值为t 元素,返回指向新添加元素的迭代器 | array、forward_list专有、 |
c.insert(p, n , t) | 迭代器p指向元素,之前位置插入n个元素,返回指向新添加元素的迭代器 | array、 |
c.insert(p, b , e) | 迭代器p、e指定范围内的元素,添加到迭代器p指向的元素之前 | array、 |
c.insert(p, i1) | i1:花括号包围的元素列表。将i1的值添加到迭代器p指向元素之前 | array、 |
删除元素(array不支持)
操作 | 说明 | 不支持容器 |
---|---|---|
c.pop_back(t) | 删除c尾元素 | array、forward_list |
c.pop_front() | array、vector、string | |
c.erase(p) | 删除迭代器p指向的元素,返回指向被删元素之后的元素的迭代器, | array、forward_list专有 |
c.erase(b,e) | 删除迭代器b、e指定范围内的元素,返回指向最后1个被删元素之后的元素的迭代器 | array、 |
c.clear() | 删除所有元素 | array、 |
访问元素
操作 | 说明 | 不支持容器 |
---|---|---|
c.back(t) | 返回c尾元素的引用 | forward_list |
c.front() | 返回c首元素的引用 | |
c[n] 下标运算符 | 返回c中下标为n的引用 | |
c.at(n) | 返回c中下标为n的引用 | list、forward_list |
改变容器大小(array不支持)
已经保存的元素个数(允许有剩余空间)
操作 | 说明 | 不支持容器 |
---|---|---|
c.resize(n) | 调整c的大小为n个元素。若n < c.size(),多出元素丢弃。 | array、 |
c.resize(n,t) | 调整c的大小为n个元素。新添加的元素初始化值为 t | array、 |
管理容器大小(仅vector、string、deque)
操作 | 说明 | 仅支持容器 |
---|---|---|
c.shrink_to_fit() | 让capacity()减少,== size() | vector、string、deque |
c.capacity() | 不重新分配内存,最多可以保存多少元素 | vector、string |
c.reserve() | 分配至少能 容纳n个元素的内存空间 | vector、string |
关系运算(= != > >= < <= )
实质:元素的逐对比较
操作 | 说明 | 不支持容器 |
---|---|---|
= !=(相等运算符) | 大小相同、所有元素两两对应 | |
> >= < <= | 无序关联容器 |
------------关联容器------------
待补充