首页 > 其他分享 >7 STL-deque

7 STL-deque

时间:2022-11-24 11:46:51浏览次数:32  
标签:deque end 容器 STL printDeque elem const

 重新系统学习c++语言,并将学习过程中的知识在这里抄录、总结、沉淀。同时希望对刷到的朋友有所帮助,一起加油哦!

 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦!

写在前面,本篇章主要介绍STL中常用容器deque。

1.1 deque的基本概念

功能:

        双端数组,可以对头端尾端进行插入和删除操作。

deque和vector的区别:

  • vector对于头部的元素插入删除效率低,而且数据量越大,效率越低。
  • deque头部的插入删除效率比vector高
  • vector访问元素速度比deque快。(原因与内部实现有关)

​编辑

deque的工作原理:

  • deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据
  • 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。
  • deque的迭代器也支持随机访问。

编辑

 

1.2 deque构造函数

函数原型:

deque<T> deqT;            //默认构造形式
deque(beg, end);        //构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);            //构造函数将n个elem拷贝给本身。
deque(const deque& deq); //拷贝构造函数

示例:


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

//deque<T> deqT;			//默认构造形式
//deque(beg, end);		//构造函数将[beg, end)区间中的元素拷贝给本身。
//deque(n, elem);			//构造函数将n个elem拷贝给本身。
//deque(const deque& deq); //拷贝构造函数

void printDeque(const deque<int>& d) {
	// const_iterator const迭代器
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test() {
	deque<int> d;
	for (int i = 0; i < 5; i++) {
		d.push_back(i);
	}

	printDeque(d);

	//deque(beg, end);		//构造函数将[beg, end)区间中的元素拷贝给本身。
	deque<int> d2(d.begin(), d.end());
	printDeque(d2);

	//deque(n, elem);			//构造函数将n个elem拷贝给本身。
	deque<int> d3(10, 5);
	printDeque(d3);

	//deque(const deque& deq); //拷贝构造函数
	deque<int> d4(d3);
	printDeque(d4);

	cout << d.front() << endl;  // 第一个元素
	cout << d.back() << endl;  // 最后一个元素
	cout << *d.begin() << endl;  // 第一个元素
	cout << *(d.end() - 1) << endl;  // 最后一个元素
	cout << *d.rbegin() << endl;  // 最后一个元素
	cout << *(d.rend()-1) << endl;  // 第一个元素
}

int main() {
	test();

	system("pause");
	return 0;
}

 

1.3 deque赋值操作

函数原型:

  • deque& operator=(const deque& deq);         //重载等号操作符
  • assign(beg, end);                                          //将[beg, end)区间中的数据拷贝赋值给本身
  • assign(n, elem);                                            //将n个elem拷贝赋值给本身

示例:


#include <iostream>
#include <string>
#include<deque>

using namespace std;

//deque& operator=(const deque& deq); //重载等号操作符
//assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
//assign(n, elem); //将n个elem拷贝赋值给本身。

void printDeque(const deque<int>& d) {
	// const_iterator const迭代器
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test() {
	deque<int> d;
	for (int i = 0; i < 5; i++) {
		d.push_back(i);
	}

	printDeque(d);
	
	//deque& operator=(const deque& deq); //重载等号操作符
	deque<int> d2;
	d2 = d;
	printDeque(d2);
	
	//assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
	deque<int> d3;
	d3.assign(d.begin(), d.begin()+2);
	printDeque(d3);

	//assign(n, elem); //将n个elem拷贝赋值给本身。
	deque<int> d4;
	d4.assign(10, 5);
	printDeque(d4);
}

int main() {
	test();

	system("pause");
	return 0;
}

 

1.4 deque大小操作

函数原型:

  • deque.empty();                  //判断容器是否为空
  • deque.size();                    //返回容器中元素的个数
  • deque.resize(num);        //重新指定容器长度为num,若容器变长,则以默认值填充新位置。​                                              //如果容器变短,则末尾超出容器长度的元素被删除。
  • deque.resize(num, elem); //重新指定容器长度为num,若容器变长,则以elem值填充新位置。                                          //如果容器变短,则末尾超出容器长度的元素被删除。

示例:


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

//deque.empty();			//判断容器是否为空
//deque.size();			//返回容器中元素的个数
//deque.resize(num);		//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
//​						//如果容器变短,则末尾超出容器长度的元素被删除。
//deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
//​						//如果容器变短,则末尾超出容器长度的元素被删除。
void printDeque(const deque<int>& d) {
	// const_iterator const迭代器
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test() {
	deque<int> d;
	for (int i = 0; i < 5; i++) {
		d.push_back(i);
	}
	printDeque(d);

	if (d.empty()) {
		cout << "d 为空" << endl;
	}
	else {
		cout << "d 不为空" << endl;
		cout << "d中元素个数为:" << d.size() << endl;
	}

	//deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
	//如果容器变短,则末尾超出容器长度的元素被删除。
	d.resize(10);
	printDeque(d);

	d.resize(8);
	printDeque(d);

	//deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除。
	d.resize(10, 3);
	printDeque(d);

	d.resize(5, 3);
	printDeque(d);
}

int main() {
	test();

	system("pause");
	return 0;
}

 

1.5 deque插入和删除

函数原型:

  • push_back(elem);                 //在容器尾部添加一个数据
  • push_front(elem);                 //在容器头部插入一个数据
  • pop_back();                         //删除容器最后一个数据
  • pop_front();                         //删除容器第一个数据

         指定位置操作:

  • insert(pos, elem);                 //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • insert(pos, n, elem);            //在pos位置插入n个elem数据,无返回值。
  • insert(pos, beg, end);          //在pos位置插入[beg,end)区间的数据,无返回值。
  • clear();                                 //清空容器的所有数据
  • erase(beg, end);                 //删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos);                         //删除pos位置的数据,返回下一个数据的位置

示例:


#include <iostream>
#include <string>
#include<deque>

using namespace std;

void printDeque(const deque<int>& d) {
	// const_iterator const迭代器
	for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test() {
	deque<int> d;
	for (int i = 0; i < 5; i++) {
		d.push_back(i);//在容器尾部添加一个数据
	}

	printDeque(d);
	
	//push_front(elem); //在容器头部插入一个数据
	d.push_front(8);
	printDeque(d);
	
	//pop_back(); //删除容器最后一个数据
	d.pop_back();
	printDeque(d);
	
	//pop_front(); //删除容器第一个数据
	d.pop_front();
	printDeque(d);

	//// 指定位置操作:
	//insert(pos, elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
	d.insert(d.begin(), 100);
	printDeque(d);
	
	//insert(pos, n, elem); //在pos位置插入n个elem数据,无返回值。
	d.insert(d.begin() + 1, 2, 200);
	printDeque(d);	

	//insert(pos, beg, end); //在pos位置插入[beg,end)区间的数据,无返回值。
	deque<int> d2;
	d2.insert(d2.begin(), d.begin(), d.end());
	printDeque(d2);

	//clear(); //清空容器的所有数据
	d2.clear();
	printDeque(d2);
	
	//erase(beg, end); //删除[beg,end)区间的数据,返回下一个数据的位置。
	d.erase(d.begin(), d.begin() + 1);
	printDeque(d);
	
	//erase(pos); //删除pos位置的数据,返回下一个数据的位置
	d.erase(d.begin() + 2);
	printDeque(d);

}

int main() {
	test();

	system("pause");
	return 0;
}

 

1.6 deque数据存取

函数原型:

  • at(int idx);                 //返回索引idx所指的数据
  • operator[];                 //返回索引idx所指的数据
  • front();                       //返回容器中第一个数据元素
  • back();                       //返回容器中最后一个数据元素

示例:


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


void printDeque(const deque<int>& d) {
	for (auto item : d) {
		cout << item << " ";
	}
	cout << endl;
}

void test() {
	deque<int> d;
	for (int i = 0; i < 5; i++) {
		d.push_front(i);
	}
	printDeque(d);

	//at(int idx); //返回索引idx所指的数据
	cout << d.at(2) << endl;
	
	//operator[]; //返回索引idx所指的数据
	cout << d[2] << endl;

	//front(); //返回容器中第一个数据元素
	cout << d.front() << endl;

	//back(); //返回容器中最后一个数据元素
	cout << d.back() << endl;

}

int main() {
	test();

	system("pause");
	return 0;
}

 

1.7 deque排序

函数原型:

sort(pos,npos);         对[pos,npos)区间内元素进行排序

示例:

#include <iostream>
#include <string>
#include<deque>
#include<algorithm>// 标准算法头文件
using namespace std;


void printDeque(const deque<int>& d) {
	for (auto item : d) {
		cout << item << " ";
	}
	cout << endl;
}

void test() {
	deque<int> d;
	d.push_back(30);
	d.push_back(50);
	d.push_back(20);
	d.push_back(40);
	d.push_back(10);
	printDeque(d);

	// 排序,默认从小到大
	// 对于支持随机访问的迭代器容器,都可以利用sort来排序
	// vector容器也支持sort排序
	sort(d.begin(), d.end());
	printDeque(d);
}

int main() {
	test();

	system("pause");
	return 0;
}


标签:deque,end,容器,STL,printDeque,elem,const
From: https://www.cnblogs.com/echolxl/p/16921330.html

相关文章

  • stl之六大部件
    有哪六大部件?容器、分配器、算法、迭代器、适配器、仿函数这些部件分别是干啥的?1.容器容器就是数据结构,里面有list链表、queue队列等容器用来放/取东西(也就是数据)容......
  • 全球名校AI课程库(41)| WUSTL · 深度神经网络应用全案例实操系列课程『Applications of
    <divalign=center><imgalt="T81-558;ApplicationsofDeepNeuralNetworks;深度神经网络应用案例实操"src="http://tva1.sinaimg.cn/large/0060yMmAly1h6wx48cg8hj31k......
  • 31. 下一个排列(stl的algorithm中next_permutation的实现)
    注:这题思路就是stl的algorithm中next_permutation的实现思路整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如,arr=[1,2,3] ,以下这些都可以视作 ......
  • 【C++/STL】0.容器概述
    文章目录​​一、容器分类​​​​(1)序列性容器​​​​(2)关联式容器​​​​(3)容器适配器​​​​二、容器共性​​​​三、容器比较​​一、容器分类(1)序列性容器​​序列式容......
  • 【C++/STL】2. vector向量
    vector与常用的数组类似,占用连续内存空间,对随机存取支持很好。可以类似数组用下标访问,也可以类似字符串用​​vector.at()​​成员函数访问vector是尾部开口设计,类似栈。从......
  • 踩坑JSTL标签库:/WEB-INF/jsp/fore/home.jsp (行.: [3], 列: [0]) 无法在web.xml或使用
    Tomcat9及之前使用到的JSTL库最近心血来潮想复习一下JavaWEB,调试JSTL标签的时候出现了一些错误,如标题所示。先说下场景,我已经在:WEB-INF/lib下添加了Tomcat9使用JSTl需要用......
  • STL标准库使用指南
    不管是在CSP还是在NOI的考场上,STL都是一个非常好使的东西(deque受害者别喷我QWQ)。所以熟练掌握STL的使用能让你在考场上轻松很多。基础queuestackpriority_queue这几......
  • stl: rope(块状链表)
    今天比赛中看到的一个挺简单的东西,除了常数大,别的都挺好的#include<ext/rope>//头文件usingnamespace__gnu_cxx;//注意名称空间rope<int>rp;intmain(){......
  • <四>理解空间配置器allocator, 优化STL 中的Vector
    .在上一节我们实现的MyVector存在哪些问题?问题1现在有Student类classStudent{public:Student(){cout<<"构造Student对象"<<endl;}~Student(){cout<<"析......
  • C++ STL简介
     vector,变长数组,倍增的思想size()返回元素个数empty()返回是否为空clear()清空front()/back()push_back()/pop_back()begin()/en......