对STL的理解:
- stl是c++标准程序库的核心,深刻影响了标准程序库的整体结构。
- stl由一些可适应不同需求的集合类,以及在这些数据集合上操作的算法构成。
- stl内的所有组件都由模板构成,其元素可以是任意类型。
- stl是所有c++编译器和所有操作系统平台都支持的一种库。
- 所有容器中存放的都是值而非引用。(如果希望存放的不是副本,容器元素只能是指针)
- 所有元素都形成一个次序,可以按相同的次序一次或多次遍历每个元素
- 必须能够通过拷贝构造函数进行复制
- 必须可以通过赋值运算符完成赋值操作
- 必须可以通过析构函数完成销毁动作
- 序列式容器元素的默认构造函数必须可用
- 某些动作必须定义operator==,例如搜寻操作
- 关联式容器必须定义出排列准则,默认情况是重载
- 可遍历STL容器内全部或部分元素的对象
- 指出容器中的一个特定位置
- 迭代器的基本操作
操作 | 效果 |
* | 返回当前位置上的元素值。如果该元素有成员,可以通过迭代器以operator->取用 |
++ | 将迭代器前进至下一元素 |
==和!= | 判断两个迭代器是否指向同一位置 |
= | 为迭代器赋值(将所指元素的位置赋值过去) |
begin() | 返回一个迭代器,指向第一个元素 |
end() |
返回一个迭代器,指向最后一个元素之后
|
操作 |
效果 |
vector<T> c |
产生空的vector |
vector<T> c1(c2) |
产生同类型的c1,并将复制c2的所有元素 |
vector<T> c(n) |
利用类型T的默认构造函数和拷贝构造函数生成一个大小为n的vector |
vector<T> c(n,e) |
产生一个大小为n的vector,每个元素都是e |
vector<T>c(beg,end) |
产生一个vector,以区间[beg,end]为元素初值 |
~vector<T>() |
销毁所有元素并释放内存。 |
操作
|
c.size() 返回元素个数 |
c.empty() 判断容器是否为空 |
c.max_size() 返回元素最大可能数量 |
c.capacity() 返回重新分配空间前可容纳的最大元素数量 |
c.reserve(n) 扩大容量为n |
c1==c2 判断c1是否等于c2 |
c1!=c2 判断c1是否不等于c2 |
c1<c2 判断c1是否小于c2 |
c1>c2 判断c1是否大于c2 |
c1<=c2 判断c1是否小于等于c2 |
c1>=c2 判断c1是否大于等于c2 |
操作 |
效果 |
c1 = c2 |
将c2的全部元素赋值给c1 |
c.assign(n,e) |
将元素e的n个拷贝赋值给c |
c.assign(beg,end) |
将区间[beg,end]的元素赋值给c |
c1.swap(c2) |
将c1和c2元素互换 |
swap(c1,c2) |
同上,全局函数 |
操作 |
效果 |
|
at(idx) |
返回索引idx所标识的元素的引用,进行越界检查 |
|
operator [](idx) |
返回索引idx所标识的元素的引用,不进行越界检查 |
|
front() |
返回第一个元素的引用,不检查元素是否存在 |
|
back() |
返回最后一个元素的引用,不检查元素是否存在
|
操作 |
效果 |
begin() |
返回一个迭代器,指向第一个元素 |
end() |
返回一个迭代器,指向最后一个元素之后 |
rbegin() |
返回一个逆向迭代器,指向逆向遍历的第一个元素 |
rend() |
返回一个逆向迭代器,指向逆向遍历的最后一个元素
|
迭代器持续有效,除非发生以下两种情况:
(1)删除或插入元素
操作 |
效果 |
c.insert(pos,e) |
在pos位置插入元素e的副本,并返回新元素位置 |
c.insert(pos,n,e) |
在pos位置插入n个元素e的副本 |
c.insert(pos,beg,end) |
在pos位置插入区间[beg,end]内所有元素的副本 |
c.push_back(e) |
在尾部添加一个元素
e
的副本
|
操作 |
效果 |
c.pop_back() |
移除最后一个元素但不返回最后一个元素 |
c.erase(pos) |
删除pos位置的元素,返回下一个元素的位置 |
c.erase(beg,end) |
删除区间[beg,end]内所有元素,返回下一个元素的位置 |
c.clear() |
移除所有元素,清空容器 |
c.resize(num) |
将元素数量改为num(增加的元素用defalut构造函数产生,多余的元素被删除) |
c.resize(num,e) |
将元素数量改为
num
(增加的元素是
e
的副本)
|
操作 |
效果 |
map c |
产生空的map |
map c1(c2) |
产生同类型的c1,并复制c2的所有元素 |
map c(op) |
以op为排序准则产生一个空的map |
map c(beg,end) |
以区间[beg,end]内的元素产生一个map |
map c(beg,end,op) |
以op为排序准则,以区间[beg,end]内的元素产生一个map |
~ map() |
销毁所有元素并释放内存。
|
操作 |
效果 |
c.size() |
返回元素个数 |
c.empty() |
判断容器是否为空 |
c.max_size() |
返回元素最大可能数量 |
c1==c2 |
判断c1是否等于c2 |
c1!=c2 |
判断c1是否不等于c2 |
c1<c2 |
判断c1是否小于c2 |
c1>c2 |
判断c1是否大于c2 |
c1<=c2 |
判断c1是否大于等于c2 |
c1>=c2 |
判断
c1
是否小于等于
c2
|
操作 |
效果 |
c1 = c2 |
将c2的全部元素赋值给c1 |
c1.swap(c2) |
将c1和c2的元素互换 |
swap(c1,c2) |
同上,全局函数
|
操作 |
效果 |
count(key) |
返回”键值等于key”的元素个数 |
find(key) |
返回”键值等于key”的第一个元素,找不到返回end |
lower_bound(key) |
返回”键值大于等于key”的第一个元素 |
upper_bound(key) |
返回”键值大于key”的第一个元素 |
equal_range(key) |
返回
”
键值等于
key
”
的元素区间
|
操作 |
效果 |
begin() |
返回一个双向迭代器,指向第一个元素 |
end() |
返回一个双向迭代器,指向最后一个元素之后 |
rbegin() |
返回一个逆向迭代器,指向逆向遍历的第一个元素 |
rend() |
返回一个逆向迭代器,指向逆向遍历的最后一个元素
|
操作 |
效果 |
c.insert(pos,e) |
在pos位置为起点插入e的副本,并返回新元素位置(插入速度取决于pos) |
c.insert(e) |
插入e的副本,并返回新元素位置 |
c.insert(beg,end) |
将区间
[
beg,end
]
内所有元素的副本插入到
c
中
|
操作 |
效果 |
c.erase(pos) |
删除迭代器pos所指位置的元素,无返回值 |
c.erase(val) |
移除所有值为val的元素,返回移除元素个数 |
c.erase(beg,end) |
删除区间[beg,end]内所有元素,无返回值 |
c.clear() |
移除所有元素,清空容器
|
学完这个标准模板库,我认为标准模板库挺有用的,特别是写带有数组的代码时,使用vector挺方便的,比如在数组中插入一个数,可以直接c.insert(pose,e),解释为在pose位置上插入一个元素e,c.insert(pose,n,e)在pose位置上插入n个元素e的副本;c.insert(pos,beg,end)在pos位置插入区间[beg,end]内所有元素的副本;c.push_back(e)在尾部添加一个元素e的副本,stl中vector还可以动态追加内容,总之这个标准模板库使用起来非常方便,但是由于我们才刚开始学,可能写代码时,不太会用,但是一旦学会之后,写起代码就会既方便,效率又高。所以我们在写代码的时候要多使用刚学的STL,从而提高我们写程序水平。