详解c++STL—容器deque

目录

1、deque容器的基本概念

1.1、功能

1.2、deque与vector区别

1.3、deque内部工作原理

2、deque构造函数

2.1、功能描述

2.2、函数原型

2.3、示例

3、deque赋值操作

3.1、功能描述

3.2、函数原型

3.3、示例

4、deque大小操作

4.1、功能描述

4.2、函数原型

4.3、示例

5、deque插入和删除

5.1、 功能描述

5.2、函数原型

5.3、示例

6、deque数据存取

6.1、功能描述

6.2、函数原型

6.3、示例

7、deque排序

7.1、功能描述

7.2、算法

7.3、示例


1、deque容器的基本概念

1.1、功能

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

1.2、deque与vector区别

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度回比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

详解c++STL—容器deque_第1张图片

1.3、deque内部工作原理

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

详解c++STL—容器deque_第2张图片

deque容器的迭代器也是支持随机访问

2、deque构造函数

2.1、功能描述

  • deque容器构造

2.2、函数原型

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

2.3、示例

//deque构造函数
void myprint(const deque d) {
	for (deque::const_iterator it = d.begin(); it != d.end();it++) {
		/**it = 10;*/
		cout << *it << " ";
	}
	cout << endl;
}


void test01() {

	//1、默认构造
	deque d;
	for (int i = 0; i < 10; i++) {
		d.push_back(i);
	}
	myprint(d);

	//2、区间构造
	deque d1(d.begin(),d.end());
	myprint(d1);

	//3、n个elem构造
	deque d2(10,100);
	myprint(d2);

	//4、拷贝构造
	deque d3(d2);
	myprint(d3);


}

int main() {
	test01();
	system("pause");
	return 0;
}

详解c++STL—容器deque_第3张图片

3、deque赋值操作

3.1、功能描述

  • 给deque容器进行赋值

3.2、函数原型

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

3.3、示例

//deque赋值
void myprint(const deque d) {
	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {
		/**it = 10;*/
		cout << *it << " ";
	}
	cout << endl;
}


void test01() {

	deque d;
	for (int i = 0; i < 10; i++) {
		d.push_back(i);
	}
	myprint(d);

	//1、等号赋值
	deque d1;
	d1 = d;
	myprint(d1);

	//2、assign区间赋值
	deque d2;
	d2.assign(d1.begin(),d1.end());
	myprint(d2);

	//3、assign,n个elem赋值
	deque d3;
	d3.assign(10,100);
	myprint(d3);

}

int main() {
	test01();
	system("pause");
	return 0;
}

详解c++STL—容器deque_第4张图片

4、deque大小操作

4.1、功能描述

  • 对deque容器的大小进行操作

4.2、函数原型

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

4.3、示例

//deque大小操作
void myprint(const deque d) {
	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {

	deque d;
	for (int i = 0; i < 10; i++) {
		d.push_back(i);
	}
	myprint(d);

	//1、判断是否为空
	if (d.empty()) {
		cout << "d,为空" << endl;
	}
	else {
		cout << "d,不为空" << endl;
		//2、输出容器大小
		cout << "d,大小为:" << d.size() << endl;
	}

	//3、改变大小,空缺默认用0填充
	d.resize(15);
	myprint(d);

	//4、改变大小,设定空缺用1填充
	d.resize(20,1);
	myprint(d);

	//5、改变大小,过小发生截断
	d.resize(5);
	myprint(d);
}

int main() {
	test01();
	system("pause");
	return 0;
}

详解c++STL—容器deque_第5张图片

注意:deque没有容量的概念

5、deque插入和删除

5.1、 功能描述

  • 向deque容器中插入和删除数据

5.2、函数原型

两端插入操作:

  • 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位置的数据,返回下一个数据的位置。

5.3、示例

//deque大小操作
void myPrint(const deque d) {
	for (deque::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

//两端操作
void test01() {

	deque d;
	//尾插尾删
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.pop_back();
	myPrint(d);

	//头插头删
	d.push_front(40);
	d.push_front(50);
	d.push_front(60);
	d.pop_front();
	myPrint(d);

}

//指定位置操作
void test02() {
	deque d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);
	d1.push_back(40);
	myPrint(d1);

	//1、指定位置插入一个值
	d1.insert(d1.begin(),50);
	myPrint(d1);

	//2、指定位置插入多个相同值
	d1.insert(d1.end(), 2, 60);
	myPrint(d1);

	//3、指定位置插入一个区间
	deque d2;
	d2.push_back(1);
	d2.push_back(2);
	d2.push_back(3);

	d1.insert(d1.begin(),d2.begin(),d2.end());
	myPrint(d1);

}

//删除操作
void test03() {
	deque d1;
	d1.push_back(10);
	d1.push_back(20);
	d1.push_back(30);
	d1.push_back(40);
	myPrint(d1);

	//1、指定位置删除,返回下一个数据的位置
	d1.erase(d1.begin());
	myPrint(d1);
	
	//2、指定区间删除,返回下一个数据的位置
	//如果区间为【begin,end】,等价于 clear()
	d1.erase(d1.begin(),d1.end());
	myPrint(d1);

	//3、清空
	d1.clear();
	myPrint(d1);

}

int main() {
	//test01();

	//test02();
	test03();
	system("pause");
	return 0;
}

详解c++STL—容器deque_第6张图片

详解c++STL—容器deque_第7张图片

详解c++STL—容器deque_第8张图片

6、deque数据存取

6.1、功能描述

  • 对deque 中的数据的存取操作

6.2、函数原型

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

6.3、示例

//deque容器的存取
void test01() {
	deque d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	d.push_back(50);

	//1、[]存取
	for (int i = 0; i < d.size();i++) {
		cout << d[i] << " ";
	}
	cout << endl;

	//2、at()存取
	for (int i = 0; i < d.size(); i++) {
		cout << d.at(i) << " ";
	}
	cout << endl;

	//3、front(),返回第一个
	int ret = d.front();
	cout << ret << endl;

	//4、back(),返回最后一个
	ret = d.back();
	cout << ret << endl;

}

int main() {
	test01();
}

详解c++STL—容器deque_第9张图片

7、deque排序

7.1、功能描述

  • 利用算法实现对deque容器进行排序

7.2、算法

  • sort(iterator beg, iterator end); //对beg和end区间内元素进行排序

7.3、示例

//deque容器的存取
void myPrint(const deque d) {
	for(int i = 0; i < d.size(); i++) {
		cout << d[i] << " ";
	}
	cout << endl;
}

void test01() {
	deque d;
	d.push_back(50);
	d.push_back(40);
	d.push_back(30);
	d.push_back(20);
	d.push_back(10);

	cout << "排序前:";
	myPrint(d);

	//默认升序
	sort(d.begin(),d.end());
	cout << "排序后:";
	myPrint(d);

}

int main() {
	test01();
}

详解c++STL—容器deque_第10张图片

注意事项:

1、sort()默认升序排序

2、对于支持随机访问的迭代器的容器,都可以用sort()排序,如vector

3、使用sort()时,需要包含头文件

你可能感兴趣的:(CPP,c++,学习,STL)