【STL记录】Containers--Deques

雨燕双飞 提交于 2019-12-27 18:06:01

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Deque和vector很像,区别是deque可以在两头插入和删除。

要使用deque,需加上头文件:

#include <deque>

一、Abilities of Deque

1.deque与vector的不同之处

  • 在头尾插入和移除元素都很快
  • 访问元素的内部结构更加间接,因此访问和移动稍慢
  • Iterator必需是smart pointer而不是ordinary pointer,因为要在不同blocks之间跳
  • deque能包含更多的元素,所以max_size()更大一些
  • Deques不提供控制capacity和再分配的支持
  • 当不在使用时,内存空间将释放

 所以,当满足一下条件时,使用deque:

  • 在两端插入和移除元素
  • 不指向Container的元素
  • 重要的一点是当不再使用时container会释放内存(并不能保证一定会发生)

 2.Constructors and Destructor

Operation Effect
 deque<Elem> c Default constructor:创建一个空的deque
 deque<Elem> c(c2) Copy constructor:通过复制c2创建c
 deque<Elem> c = c2 Copy constructor:通过复制c2创建c
 deque<Elem> c(rv) Move constructor:creates a new deque,taking the contents of the rvalue rv
 deque<Elem> c = rv Move constructor:creates a new deque,taking the contents of the rvalue rv
 deque<Elem> c(n) 使用默认构造函数创建一个有n个元素的deque
 deque<Elem> c(n, elem) 创建一个有n个元素的deque,并且使用elem初始化
 deque<Elem> c(beg, end) 创建一个使用范围[beg,end)初始化的deque
 deque<Elem> c(initList) 创建一个使用initList初始化的deque
 deque<Elem> c = initList 创建一个使用initList初始化的deque
 c.~deque() 销毁所有元素并释放内存

 

二、Vector Operations

1.Nonmodifying Operations

Operation Effect
 c.empty() 返回容器是否为空(相当于size() == 0)
 c.size() 返回当前元素的个数
 c.max_size() 返回可能存在元素的最大个数
 c.shrink_to_fit() 收缩capacity,适应元素个数
 c1 == c2 返回c1是否等于c2
 c1 != c2 返回c1是否不等于c2
 c1 < c2 返回c1是否小于c2
 c1 > c2 返回c1是否大于c2
 c1 <= c2 返回c1是否小于等于c2
 c1 >= c2 返回c1是否大于等于c2
 c[idx] 返回索引为idx的元素(无边界检查)
 c.at[idx] 返回索引为idx的元素(有边界检查,抛出异常)
 c.front() 返回第一个元素(不检查元素是否存在)
 c.back() 返回最后一个元素(不检查元素是否存在)

 2.Modifying Operations

Operation Effect
 c.push_back(elem) 将elem附加到末尾
 c.pop_back() 移除最后一个元素,不返回
 c.push_front(elem) 将elem附加到开头
 c.pop_front() 移除第一个元素,不返回
 c.insert(pos, elem) 将elem插入到pos之前的位置,并返回新元素的位置
 c.insert(pos, n, elem) 在pos之前的位置开始插入n个elem,并返回新插入的第一个元素的位置
 c.insert(pos, beg, end) 将[beg, end)的值插入到从pos之前的位置,并返回第一个新元素的位置
 c.insert(pos, initlist) 将initlist的值插入到从pos之前的位置,并返回第一个新元素的位置
 c.emplace(pos, args...) 将args插入到pos之前的位置,并返回第一个新元素的位置
 c.emplace_back(args...) 将args附加到末尾
 c.emplace_front(args...) 将args附加到开头
 c.erase(pos) 移除pos所指的元素,并返回下一个元素位置
 c.erase(beg, end) 移除范围[beg,end)的元素,并返回下一个元素的位置
 c.resize(num) 设置元素个数为num,如果增长了,使用默认构造函数初始化
 c.resize(num, elem) 设置元素个数为num,如果增长了,使用elem初始化
 c.clear() 移除所有元素

 三、Example of Using Deques

#include<iostream>
#include<deque>
#include<string>
#include<algorithm>
#include<iterator>
using namespace std;

int main()
{
	//create empty deque of string
	deque<string> coll;
	
	//insert several elements
	coll.assign( 3, "string");
	coll.push_back("last string");
	coll.push_front("first string");
	
	//print elements separated by newlines
	copy(coll.cbegin(), coll.cend(),
	     ostream_iterator<string>(cout, "\n"));
	cout << endl;
	
	//remove first and last element
	coll.pop_front();
	coll.pop_back();
	
	//insert "another" into every element but the first
	for(unsigned i = 1; i < coll.size(); ++i) {
		coll[i] = "another " + coll[i];
	}
	
	//change size to four elements
	coll.resize( 4, "resized string");
	
	//print elements separated by  newlines
	copy( coll.cbegin(), coll.cend(),
	      ostream_iterator<string>(cout, "\n"));
	
}

输出:

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!