首页 > 其他分享 >deque容器

deque容器

时间:2024-11-29 14:32:09浏览次数:17  
标签:deque printdeque 容器 元素 插入 d2 d1

deque容器概述

std::deque(双端队列)是C++标准库中的一个容器,类似于std::vector,但它提供了在头部和尾部高效插入和删除元素的能力,时间复杂度为O(1)。与std::vector不同,std::deque不保证所有元素都存储在连续的内存空间中,而是通过一系列分段的连续内存块来存储元素,这些内存块通过一个中控器(map)连接起来,中控器维护每个内存块的地址,从而实现逻辑上的连续性

deque的赋值方式

std::deque提供了多种赋值方式:

  • 拷贝赋值:使用operator=可以将一个deque的对象赋值给另一个deque对象,实现浅拷贝。
  • 区间赋值:使用assign(beg, end)可以从其他容器或数组的一个区间复制元素到deque中。
  • 重复赋值:使用assign(n, elem)可以将n个相同的元素elem赋值给deque
deque的插入方式

std::deque提供了多种插入元素的方式:

  • 尾部插入:使用push_back(elem)可以在deque的尾部添加一个元素。
  • 头部插入:使用push_front(elem)可以在deque的头部添加一个元素。
  • 指定位置插入:使用insert(pos, elem)可以在指定位置pos插入一个元素;使用insert(pos, n, elem)可以在指定位置pos插入n个相同的元素elem;使用insert(pos, beg, end)可以在指定位置pos插入从begend的区间内的所有元素
deque的empty()函数

empty()函数用于检查deque容器是否为空,如果为空则返回true,否则返回false。这是一个常数时间操作

deque的内部结构

std::deque的内部结构由多个分段的连续内存块组成,每个内存块的大小通常是固定的。中控器(map)是一个指针数组,每个元素是指向一个内存块的指针。当需要在头部或尾部插入元素时,deque会动态地增加新的内存块,并更新中控器,确保逻辑上的连续性。这种设计使得deque能够在头部和尾部高效地插入和删除元素,但牺牲了迭代器的简单性和随机访问的效率

deque的resize()函数

resize()函数用于改变deque的大小。如果新的大小大于当前大小,deque会用默认值或指定值填充新增的部分;如果新的大小小于当前大小,deque会删除多余的元素。这是一个线性时间操作

标准算法库algorithm

<algorithm>头文件提供了大量的泛型算法,可以应用于任何符合迭代器要求的容器。例如,sort()函数可以用于对deque中的元素进行排序,find()函数可以用于查找元素,reverse()函数可以用于反转元素顺序等

sort()的应用

sort()函数是一个高效的排序算法,通常使用快速排序或归并排序。它可以对deque中的元素进行排序,但需要注意的是,sort()函数需要传递两个迭代器,分别指向要排序的范围的开始和结束位置

代码逐句解释

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

// 打印deque容器中的元素
void printdeque(deque<int>&d) {
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

// 测试函数
void test01() {
	// 创建一个空的deque容器
	deque<int>d1;
	// 向deque容器尾部插入1到10的整数
	for (int i = 1; i <= 10; i++) {
		d1.push_back(i);
	}
	// 打印deque容器中的元素
	printdeque(d1);

	// 创建另一个空的deque容器
	deque<int>d2;
	// 使用赋值操作符将d1的元素复制到d2
	d2 = d1;
	// 打印d2中的元素
	printdeque(d2);

	// 从d2的尾部删除8个元素
	for (int s = 8; s > 0; s--) {
		d2.pop_back();
	}
	// 打印d2中的元素
	printdeque(d2);

	// 创建第三个空的deque容器
	deque<int>d3;
	// 使用assign函数将d1中的元素复制到d3
	d3.assign(d1.begin(), d1.end());
	// 打印d3中的元素
	printdeque(d3);

	// 检查d1是否为空,如果不为空则打印d1的大小
	if (d1.empty()) {
		cout << "d1为空" << endl;
	}
	else {
		cout << "d1的大小:" << d1.size() << endl;
		// 因为deque的容器没有容量的概念,故deque没有capacity函数
		// 因为deque内部结构
		// 将d1的大小调整为15,新插入的元素值为1
		d1.resize(15, 1);
		// 打印d1中的元素
		printdeque(d1);
	}

	// 在d1的头部插入多个元素
	d1.push_front(10);
	d1.push_front(20);
	d1.push_front(80);
	d1.push_front(5);
	d1.push_front(45);

	// 使用sort函数对d1中的元素进行排序
	sort(d1.begin(), d1.end());
	// 打印排序后的d1中的元素
	printdeque(d1);
}

int main() {
	// 调用测试函数
	test01();
	// 暂停程序,等待用户按键
	system("pause");
	return 0;
}

详细解释

  1. 包含头文件

    #include<iostream>
    #include<string>
    #include<deque>
    #include<algorithm>//标准算法头文件
    using namespace std;
    • #include<iostream>:包含输入输出流的头文件,用于标准输入输出操作。
    • #include<string>:包含字符串类的头文件,虽然在这个示例中没有直接使用字符串类,但为了完整性还是包含进来。
    • #include<deque>:包含deque容器的头文件。
    • #include<algorithm>:包含标准算法库的头文件,用于调用排序等算法。
    • using namespace std;:使用标准命名空间,避免每次调用标准库函数时都要加上std::前缀。
  2. 定义打印函数

    void printdeque(deque<int>&d) {
        for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    • void printdeque(deque<int>&d):定义一个函数,接收一个deque<int>类型的引用参数。
    • for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++):使用常量迭代器遍历deque容器。
    • cout << *it << " ":输出当前迭代器指向的元素值。
    • cout << endl;:输出换行符,结束一行。
  3. 测试函数

    void test01() {
        deque<int>d1;
        for (int i = 1; i <= 10; i++) {
            d1.push_back(i);
        }
        printdeque(d1);
    • deque<int>d1;:创建一个空的deque<int>容器。
    • for (int i = 1; i <= 10; i++) { d1.push_back(i); }:使用循环向deque容器尾部插入1到10的整数。
    • printdeque(d1);:调用打印函数,输出deque容器中的元素。
  4. 拷贝赋值

        deque<int>d2;
        d2 = d1;
        printdeque(d2);
    • deque<int>d2;:创建另一个空的deque<int>容器。
    • d2 = d1;:使用赋值操作符将d1的元素复制到d2
    • printdeque(d2);:调用打印函数,输出d2中的元素。
  5. 删除元素

        for (int s = 8; s > 0; s--) {
            d2.pop_back();
        }
        printdeque(d2);
    • for (int s = 8; s > 0; s--) { d2.pop_back(); }:使用循环从d2的尾部删除8个元素。
    • printdeque(d2);:调用打印函数,输出d2中的元素。
  6. 区间赋值

        deque<int>d3;
        d3.assign(d1.begin(), d1.end());
        printdeque(d3);
    • deque<int>d3;:创建第三个空的deque<int>容器。
    • d3.assign(d1.begin(), d1.end());:使用assign函数将d1中的元素复制到d3
    • printdeque(d3);:调用打印函数,输出d3中的元素。
  7. 检查容器是否为空

        if (d1.empty()) {
            cout << "d1为空" << endl;
        }
        else {
            cout << "d1的大小:" << d1.size() << endl;
            d1.resize(15, 1);
            printdeque(d1);
        }
    • if (d1.empty()) { cout << "d1为空" << endl; }:检查d1是否为空,如果是则输出“d1为空”。
    • else { cout << "d1的大小:" << d1.size() << endl; }:如果不是空,则输出d1的大小。
    • d1.resize(15, 1);:将d1的大小调整为15,新插入的元素值为1。
    • printdeque(d1);:调用打印函数,输出调整大小后的d1中的元素。
  8. 头部插入元素

        d1.push_front(10);
        d1.push_front(20);
        d1.push_front(80);
        d1.push_front(5);
        d1.push_front(45);
    • d1.push_front(10);:在d1的头部插入元素10。
    • d1.push_front(20);:在d1的头部插入元素20。
    • d1.push_front(80);:在d1的头部插入元素80。
    • d1.push_front(5);:在d1的头部插入元素5。
    • d1.push_front(45);:在d1的头部插入元素45。
  9. 排序

        sort(d1.begin(), d1.end());
        printdeque(d1);
    • sort(d1.begin(), d1.end());:使用sort函数对d1中的元素进行排序。
    • printdeque(d1);:调用打印函数,输出排序后的d1中的元素。
  10. 主函数

    int main() {
        test01();
        system("pause");
        return 0;
    }
    • test01();:调用测试函数。
    • system("pause");:暂停程序,等待用户按键。
    • return 0;:返回0,表示程序正常结束。

标签:deque,printdeque,容器,元素,插入,d2,d1
From: https://blog.csdn.net/wxtg1921/article/details/144135528

相关文章