7 STL-deque

 重新系统学习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;
}


posted on 2022-11-24 11:35  爱学习的小灵子  阅读(18)  评论(0编辑  收藏  举报