51Halcon机器视觉

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,微信登录

查看: 1065|回复: 0

[资料] C++ Queues(队列)、Priority Queues(优先队列)

[复制链接]
  • TA的每日心情
    耍酷
    昨天 10:00
  • 签到天数: 957 天

    连续签到: 2 天

    [LV.10]以坛为家III

    380

    主题

    1554

    帖子

    7294

    积分

    Rank: 9

    积分
    7294

    突出贡献优秀版主荣誉管理论坛元老切换助手验证会员最佳新人

    发表于 2018-4-21 10:58:01 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
    1.back() 返回一个引用,指向最后一个元素
    2.empty() 如果队列空则返回真
    3.front() 返回第一个元素
    4.pop() 删除第一个元素
    5.push() 在末尾加入一个元素
    6.size() 返回队列中元素的个数

    队列可以用线性表(list)或双向队列(deque)来实现(注意vector container 不能用来实现queue,因为vector 没有成员函数pop_front!):
    queue<list<int>> q1;
    queue<deque<int>> q2;
    其成员函数有“判空(empty)” 、“尺寸(Size)” 、“首元(front)” 、“尾元(backt)” 、“加入队列(push)” 、“弹出队列(pop)”等操作。

    例:
    1. int main()
    2. {
    3. queue<int> q;
    4. q.push(4);
    5. q.push(5);
    6. printf("%d\n",q.front());
    7. q.pop();
    8. }
    复制代码


    C++ Priority Queues(优先队列)

    C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序。
    1.empty() 如果优先队列为空,则返回真
    2.pop() 删除第一个元素
    3.push() 加入一个元素
    4.size() 返回优先队列中拥有的元素的个数
    5.top() 返回优先队列中有最高优先级的元素

    优先级队列可以用向量(vector)或双向队列(deque)来实现(注意list container 不能用来实现queue,因为list 的迭代器不是任意存取iterator,而pop 中用到堆排序时是要求randomaccess iterator 的!):
    priority_queue<vector<int>, less<int>> pq1; // 使用递增less<int>函数对象排序
    priority_queue<deque<int>, greater<int>> pq2; // 使用递减greater<int>函数对象排序
    其成员函数有“判空(empty)” 、“尺寸(Size)” 、“栈顶元素(top)” 、“压栈(push)” 、“弹栈(pop)”等。

    例:
    1. #include <iostream>
    2. #include <queue>
    3. using namespace std;

    4. class T {
    5. public:
    6. int x, y, z;
    7. T(int a, int b, int c):x(a), y(b), z(c)
    8. {
    9. }
    10. };
    11. bool operator < (const T &t1, const T &t2)
    12. {
    13. return t1.z < t2.z; // 按照z的顺序来决定t1和t2的顺序
    14. }
    15. main()
    16. {
    17. priority_queue<T> q;
    18. q.push(T(4,4,3));
    19. q.push(T(2,2,5));
    20. q.push(T(1,5,4));
    21. q.push(T(3,3,6));
    22. while (!q.empty())
    23. {
    24. T t = q.top();
    25. q.pop();
    26. cout << t.x << " " << t.y << " " << t.z << endl;
    27. }
    28. return 1;
    29. }
    复制代码
    输出结果为(注意是按照z的顺序从大到小出队的):
          3 3 6
          2 2 5
          1 5 4
          4 4 3

          再看一个按照z的顺序从小到大出队的例子:
    1. #include <iostream>
    2. #include <queue>
    3. using namespace std;
    4. class T
    5. {
    6. public:
    7. int x, y, z;
    8. T(int a, int b, int c):x(a), y(b), z(c)
    9. {
    10. }
    11. };
    12. bool operator > (const T &t1, const T &t2)
    13. {
    14. return t1.z > t2.z;
    15. }
    16. main()
    17. {
    18. priority_queue<T, vector<T>, greater<T> > q;
    19. q.push(T(4,4,3));
    20. q.push(T(2,2,5));
    21. q.push(T(1,5,4));
    22. q.push(T(3,3,6));
    23. while (!q.empty())
    24. {
    25. T t = q.top();
    26. q.pop();
    27. cout << t.x << " " << t.y << " " << t.z <<  endl;
    28. }
    29. return 1;
    30. }
    复制代码
    输出结果为:
          4 4 3
          1 5 4
          2 2 5
          3 3 6
          如果我们把第一个例子中的比较运算符重载为: bool operator < (const T &t1, const T &t2) { return t1.z > t2.z; // 按照z的顺序来决定t1和t2的顺序} 则第一个例子的程序会得到和第二个例子的程序相同的输出结果。
    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站

    51Halcon会员技术交流会员技术交流 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用

    有问题需要咨询站长?| 申请友链| 小黑屋| 手机版| Archiver|  

    粤ICP备15095995号-2 粤公网安备44030602000670号

    CopyRight © 2015-2020 51Halcon机器视觉. Tencent Cloud X3.4.

    快速回复 返回顶部 返回列表