#edu007. 学习材料 - deque/list

学习材料 - deque/list

#include<deque>

双端队列 deque 是一个支持在两端高效插入或删除元素的连续线性存储空间。 它就像 vectorqueue 的结合。 与 vector 相比,deque 在头部增删元素仅需要 O(1) 的时间;与 queue 相比,deque 像数组一样支持随机访问。

方法 描述 示例 时间复杂度
[] 随机访问 vector 类似 O(1)O(1)
begin()/end() deque 的头/尾部迭代器 vector 迭代器类似
front()/back() 队头/尾元素 queue类似
push_back(x) 从队尾入队 que.push_back(x);
push_front(x) 从队头入队 que.push_front(y);
pop_front() 从队头出队 que.pop_front( );
pop_back() 从队尾出队 que.pop_back( );
clear() 清空队列 que.clear( ); O(n)O(n)

#include<list>

list 就是链表,在确定位置的情况下,能够快速插入、删除,但是不支持随机化访问

可以将 list 当作双端队列使用,当定义多个双端队列时,list 效率要高很多。

方法 描述 示例 时间复杂度
begin()/end() 返回头/尾部迭代器 vector 迭代器类似 O(1)O(1)
front()/back() 返回第一个/最后一个元素 queue 类似,l.front() 等价于 *l.begin()
size() 返回 list 中元素个数 vector类似
insert(iterator pos,value) 在 pos 位置之前插入 value l.insert(l.begin(),10) O(1)O(1) 注意虽然插入是常数复杂度,但要找到 pos 位置需要 O(n)O(n)
erase(iterator pos) 删除 pos 位置的元素 l.erase(l.begin()); O(1)O(1) 注意虽然删除是常数复杂度,但要找到 pos 位置需要 O(n)O(n)
push_front(x)/push_back(x) 从头/尾添加 x deque O(1)O(1)
pop_front()/pop_back() 从头/尾删除元素

例子:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);
	
	list<int> l = {7, 5, 16, 8};
	
  l.push_front(25);
  l.push_back(13);
 
  // 查找 16 的位置 O(n) 
  auto it = std::find(l.begin(), l.end(), 16);
  if (it != l.end())
        l.insert(it, 42);  //在找到位置的情况下 插入 O(1) 
 
  // 输出 
  cout << "l = { ";
  for (int n : l)
      cout << n << ", ";
  cout << "};\n";

	return 0;
}

输出:

l = { 25, 7, 5, 42, 16, 8, 13, };

学习完毕

{{ select(1) }}

  • YES
  • NO