• c++ || 容器适配器


    容器适配器

    将不适用的序列式容器(vector、deque、list)变得适用。通过封装某个序列式容器,并重新组合该容器中包含的成员函数,使其满足某些特定的场景需要

    stack_deque

    先进后出
    p

    成员函数功能
    empty()当 stack 栈中没有元素时,该成员函数返回 true;反之,返回 false。
    size()返回 stack 栈中存储元素的个数
    top()返回一个栈顶元素的引用,类型为 T&。如果栈为空,程序会报错。
    push(const T& val)复制 val,再将 val 副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
    push(T&& obj)移动元素的方式将其压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
    pop()弹出栈顶元素。
    emplace(arg…)arg… 可以是一个参数,也可以是多个参数,但它们都只用于构造一个对象,并在栈顶直接生成该对象,作为新的栈顶元素。
    swap(stack & other_stack)将两个 stack 适配器中的元素进行互换,需要注意的是,进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。
    • 定义与初始化
    	stack<int> s1;               //使用默认deque作为底层基础容器
    	list<int> li{ 12,24,56,79 };
    	stack<int, list<int>> s2(li);    //使用list作为底层基础容器
    	              //基础容器初始化stack适配器  容器类型与stack底层使用的基础容器类型相同即可
    	stack<int, list<int>> s3 = s2;    //基础容器类型相同即可
    
    • 1
    • 2
    • 3
    • 4
    • 5

    queue_deque

    先进先出(first in,first out)
    0

    作为 queue 容器适配器的基础容器,其必须提供 front()、back()、push_back()、pop_front()、empty() 和 size() 这几个成员函数,符合条件的序列式容器仅有 deque 和 list。

    成员函数功能
    empty()如果 queue 中没有元素的话,返回 true。
    size()返回 queue 中元素的个数。
    front()返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
    back()返回 queue 中**最后一个元素的引用。**如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
    push(const T& obj)在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
    emplace()在 queue 的尾部直接添加一个元素。
    push(T&& obj)移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
    pop()删除 queue 中的第一个元素。
    swap(queue &other_queue)将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。
    	//queue values;
    	//queue> values;         //使用list作为基础容器
    	std::deque<int> values{ 1,2,3 };
    	std::queue<int> my_queue1(values);   //使用基础容器初始化queue容器
    	std::queue<int> my_queue(my_queue1); //使用一个适配器初始化另一个适配器
    	//cout << my_queue.back() << endl;
    	my_queue.push(5);
    	for (int i = 0; i < 8; i++)
    	{
    		my_queue.push(i + 3);
    	}
    	while (!my_queue.empty())
    	{
    		cout << my_queue.front() << endl;
    		//访问过的元素出队列
    		my_queue.pop();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    priority_queue

    • 容器适配器存储元素只能“从一端进(称为队尾),从另一端出(称为队头)”,且每次只能访问 priority_queue 中位于队头的元素
    • 容器中元素的存取,先进队列的不一定先出,而是优先级最大的元素最先出队列
    • 底层采用的是堆结构
    成员函数功能
    empty()当 priority_queue中没有元素时,该成员函数返回 true;反之,返回 false。
    size()返回 priority_queue中存储元素的个数
    top()返回一个priority_queue第一个元素的引用,类型为 T&。如果栈为空,程序会报错。
    push(const T& val)先 ** 复制 val,再将 val 副本压入** priority_queue。
    push(T&& obj)移动元素的方式将其压入priority_queue
    pop()弹出priority_queue容器适配器中第一个元素。
    emplace(arg…)arg… 可以是一个参数,也可以是多个参数,但它们都只用于构造一个对象,并在栈顶直接生成该对象,作为新的栈顶元素。
    swap(priority_queue< T> & other_stack)将两个 priority_queue适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。
    template <typename T,
            typename Container=std::vector<T>,
            typename Compare=std::less<T> >
    class priority_queue{
        //......
    }
    //typename T:指定存储元素的具体类型;
    //typename Container:指定 priority_queue 底层使用的基础容器,默认使用 vector 容器。deque容器
    //typename Compare:指定容器中评定元素优先级所遵循的排序规则,默认使用std::less按照元素值从大到小进行排序,还可以使用std::greater按照元素值从小到大排序,但更多情况下是使用自定义的排序规则。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    	priority_queue<int> value;
    
    	//使用普通数组
    	int values[]{ 4,1,3,2 };
    	std::priority_queue<int> copy_values(values, values + 4);//{4,2,3,1}
    	
    															
    	//使用序列式容器
    	std::array<int,4> valus1 { 4,1,3,2 };
    	std::priority_queue<int> copy_values(valus1.begin(), valus1.end());//{4,2,3,1}
    
    	//手动指定底层容器
    	int values1[]{ 4,1,2,3 };
    	std::priority_queue<int, std::deque<int>, std::greater<int> >copy_values(values1, values1 + 4);//{1,3,2,4}
    	return 0;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    关联容器

    set 集合

    数据有序(自动排序)底层是红黑树(增删改查速度非常快)

    不允许重复

    multiset 多重集合

    允许重复

    map 映射表

    数据按key有序 底层是红黑树
    不允许重复

    multimap 多重映射表

    数据按key有序 底层是红黑树
    允许重复

  • 相关阅读:
    教你初学者如何快速学会 Python
    【C语言进阶(14)】程序的编译与链接
    面试官:MyBatis批量插入的五种方式,哪种最强?
    异地工业设备集中运维、数据采集,一招搞定
    Java基础入门·File类的使用
    vue使用WEB自带TTS实现语音文字互转
    【Linux】inittab系统启动时sysinit含义
    [附源码]Python计算机毕业设计Django网上书城网站
    IT基础监控的全面解决方案
    服务器IPMI管理操作
  • 原文地址:https://blog.csdn.net/LQEmptycity/article/details/126122191