最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

STL

来源:博客园

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使用一个内存分配器动态处理存储需求。

  1. 创建。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,每一个都是一个数组
  2. 增加。向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向量的区间元素
  3. 删除。可以删除 尾部元素、 指定位置的元素、 区间,还可以 清空整个向量。

    a.pop_back();//删除向量中的最后一个元素a.erase(a.begin() + 1);//删除指定位置的元素a.erase(a.begin() + 3, a.end() - 3);//删除区间[first, last)中的元素a.clear();//清空向量
  4. 遍历。可以用数组表示法,也可以用迭代器对向量元素进行访问。

    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";
  5. 改变向量的大小。resize可以改变向量的大小,如果它比当前向量大,则填充默认值;如果比当前向量小,则舍弃后面的部分。

    a.resize(5);//设置向量大小为5,如果当前向量存有8个元素,则舍弃后面3个

2. 栈

栈(stack)只允许在栈顶操作,不允许在中间位置进行插入和删除操作,不支持数组表示法和随机访问。

栈的基本操作包括入栈、出栈、取栈顶、判断栈空、求栈大小。

  • stack s :创建一个空栈 \(s\) ,数据类型为int。

  • push(x) : \(x\) 入栈。

  • pop() :出栈。

  • top() :取栈顶(未出栈)。

  • empty() :判断栈是否为空,若空则返回true。

  • size() :求栈大小,返回栈中的元素个数。

3. 队列

队列(queue)只允许从队尾入队、从队头出队,不允许在中间位置插入和删除,不支持数组基本法和随机访问。

队列的基本操作包括入队、出队、取队头、判断队空、求队列大小。

  • queue q:创建一个空队 \(q\) ,数据类型为int。

  • 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() :清空链表。

关键词: