【笔记】STL的七种武器(一)顺序容器


(0)启示:程序=算法+数据结构

参考资料:

C++迭代器(STL迭代器)iterator详解 (biancheng.net)

(8条消息) 士兵队列训练问题(链表)_Stone 不会喝水的博客-CSDN博客

(8条消息) C++容器适配器_JakeMiao的专栏-CSDN博客_c++ 适配器

STL 在重载迭代器的++运算符时,后置形式也比前置形式慢。

5.STL 中有用于操作迭代器的三个函数模板,它们是:
  • advance(p, n):使迭代器 p 向前或向后移动 n 个元素。
  • distance(p, q):计算两个迭代器之间的距离,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等。如果调用时 p 已经指向 q 的后面,则这个函数会陷入死循环。
  • iter_swap(p, q):用于交换两个迭代器 p、q 指向的值。

< CONTAINER >顺序容器

0.  vector   deque  list

顺序容器的取舍,一般应遵循下面的原则:

高效的随即存取,而不在乎插入和删除的效率,使用vector

大量的插入和删除,而不关心随即存取,则应使用list

随即存取,而且需要两端数据的插入和删除,则应使用deque

1.常用算法函数

a.front();                 a.back(); 

a.size();                  a.clear();   

a.push_front(x);      a.pop_front();

a.push_back(x);      a.pop_back();

a.insert(it, x);           

a.erase(it);               a.erase(first, last)

2.vector 例题:

back and forth 倒牛奶[USACO]

图的表示和存储

3.deque 

扑克游戏: 题目加题解在这

4.list 循环链表

List容器的每个节点都含有 前驱元素指针域 、 数据域 、 后继元素指针域

在链表的任意位置进行元素的插入、删除和查找操作速度是较快的。

由于list对象的结点并不要求在一段连续的内存中,所以对于迭代器,只能通过“++”或者“–”的操作,不能对其进行+N或者-N的操作。

操作:

一)创建list对象:

  list l 或 list l(10); //创建具有10个整形元素的list对象l 。

(二)插入元素:

  push_back()  push_front()  insert()

(三)遍历元素:

(1)前向遍历:以前向迭代器的方式遍历;

(2)反向遍历:使用反向迭代器进行遍历。

(四)删除元素:

(1)remove(元素值),删除链表中的元素,值相同的元素都会被删除;

(2)pop_front()   pop_back()

(3)erase()删除迭代器位置的元素;

(4)clear()清空链表容器。

(五)查找元素:需要添加#include

  find(迭代器1,迭代器2,元素)

  函数返回一个迭代器值,若该值被找到则返回该值所在的迭代器值,若没有找到则返回end()迭代器的位置。

(六)l.sort()实现升序排序

list例题:

士兵队列训练问题

dijikstra(队列实现最短路)