STL应用
容器通用函数如下。
(资料图片)
.size():容器内的元素个数,无符号整型。
.empty():判断容器是否为空,返回一个bool值。
.front():返回容器第一个元素。
.back():返回容器最后一个元素。
.begin():指向容器第一个元素的指针。
.end():指向容器最后一个元素的下一个位置的指针。
.swap(b):交换两个容器的内容。
::interator:迭代器。
迭代器:
广义的指针,可以是指针,也可以是对其进行类似指针操作的对象。模板使算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。
例如,使用迭代器输出vector容器中的元素,代码如下。
for (vector ::interator it = a.begin(); it != a.end(); it ++ ) cout << *it << endl;
1. vector
vector(向量)是一个封装了 动态大小数组的顺序容器(Sequence Container)。顺序容器中的元素按照严格的 线性顺序排序,可以通过元素在序列中的位置访问对应的元素,支持数组表示法和随机访问。vector使用一个内存分配器动态处理存储需求。
创建。vector能够存放各种类型的对象,可以是C++标准数据类型,也可以是结构体类型。例如:
vector
a;//创建一个空的vector,数据类型为int,数组名为avector a(100);//创建一个vector,数组名为a,元素个数为100,所有数的初值都为0vector a(10, 666);//创建一个vector,数组名为a,元素个数为10,所有数的初值都为666vector b(a);//b是a的复制vector b(a.begin() + 3, a.end() - 3);//复制[a.begin() + 3, a.end() - 3)区间内的元素到vector中 创建二维数组:
vector
a[5];//相当于创建了5个vector,每一个都是一个数组 增加。向vector中添加元素,可以从 尾部添加,也可以从 中间添加。需要注意的是,从中间插入时需要将插入位置之后的所有元素 后移,时间复杂度为 \(O(n)\) ,效率较低。
a.push_back(5);//在向量尾部增加一个元素5a.insert(a.begin() + 1, 10);//在a.begin() + 1 指向元素前插入一个10a.insert(a.begin() + 1, 5, 10);//在a.begin() + 1 指向元素前插入5个10a.insert(a.begin() + 1, b, b + 3);//在a.begin() + 1 指向元素前插入b向量的区间元素
删除。可以删除 尾部元素、 指定位置的元素、 区间,还可以 清空整个向量。
a.pop_back();//删除向量中的最后一个元素a.erase(a.begin() + 1);//删除指定位置的元素a.erase(a.begin() + 3, a.end() - 3);//删除区间[first, last)中的元素a.clear();//清空向量
遍历。可以用数组表示法,也可以用迭代器对向量元素进行访问。
for (int i = 0; i < a.size(); i ++ ) cout << a[i] << "\t";for (vector
::interator it = a.begin(); it < a.end(); it ++ ) cout << *it << "\t"; 改变向量的大小。resize可以改变向量的大小,如果它比当前向量大,则填充默认值;如果比当前向量小,则舍弃后面的部分。
a.resize(5);//设置向量大小为5,如果当前向量存有8个元素,则舍弃后面3个
2. 栈
栈(stack)只允许在栈顶操作,不允许在中间位置进行插入和删除操作,不支持数组表示法和随机访问。
栈的基本操作包括入栈、出栈、取栈顶、判断栈空、求栈大小。
stack
:创建一个空栈 \(s\) ,数据类型为int。s push(x) : \(x\) 入栈。
pop() :出栈。
top() :取栈顶(未出栈)。
empty() :判断栈是否为空,若空则返回true。
size() :求栈大小,返回栈中的元素个数。
3. 队列
队列(queue)只允许从队尾入队、从队头出队,不允许在中间位置插入和删除,不支持数组基本法和随机访问。
队列的基本操作包括入队、出队、取队头、判断队空、求队列大小。
queue
:创建一个空队 \(q\) ,数据类型为int。q push(x) : \(x\) 入队。
pop() :出队。
front() :取队头(未出队)。
empty() :判断队列是否为空,若为空,则返回true。
size() :求队列大小,返回队列中的元素个数。
4. list
list是一个双向链表,可以在常数时间内插入和删除,不支持数组表示法和随机访问。
list的专用成员函数如下。
merge(b) :将链表 \(b\) 与调用链表合并,在合并之前,两个链表必须已经排序,合并后经过排序的链表被保存在调用链表中, \(b\) 为空。
remove(val) :从链表中删除val的所有节点。
splice(pos, b) :将链表 \(b\) 的内容插入pos前面, \(b\) 为空。
reverse() :将链表翻转。
sort() :将链表排序。
unique() :将连续的相同元素压缩为单个元素。不连续的相同元素无法继续压缩,因此一般先排序后去重。
其他成员函数如下。
push_front(x) / push_back(x) : \(x\) 从链表头或尾入。
pop_front() / pop_back() :从链表头或尾出。
front() / back() :返回链表头或尾元素。
insert(p, t) :在 \(p\) 之前插入 \(t\) 。
erase(p) :删除 \(p\) 。
clear() :清空链表。
关键词: