大道至簡 迴圈佇列

2021-10-09 13:36:10 字數 2258 閱讀 4889

​ 佇列可能是大家學習linux通訊時接觸到的知識,當然也是我們在程式設計中使用較多的乙個點,其中最主要的一方面用來降低程式之間的耦合度,還有非同步操作;

​ 前段時間在公司寫了乙個小的服務,同樣使用了佇列對服務進行了非同步操作,知識佇列沒有使用現有的一些大型庫,自己使用了原生的stl佇列中的介面,進行了簡單的封裝,當前對**調優不夠,後來才發現有很多的漏洞影響著效能;其中就有一條是引發今天這篇文章的元素——在程式中,需要不斷的申請釋放記憶體,這樣就影響了程式的效能;

​ 使用迴圈佇列就可以很輕鬆的解決上述問題,在程式開始的時候就申請記憶體,在程式結束的時候釋放記憶體,這樣就避免了程式不斷的申請釋放記憶體帶來的消耗~

「假溢位」是什麼?其實用大白話來說就是明明還有空間可以儲存資料,但是程式卻告訴你你沒有空間可以儲存資料了!

案例:

比如乙個佇列que,頭是front,尾是end,佇列長度是l;當front等於-1時隊空,rear等於l-1時為隊滿;佇列一般是頭部插入,尾部取出;當尾部等於l-1時,但是front不等於-1,這個佇列並沒有真正滿載,所以就會造成假溢位,這個就是假溢位的**~

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-rzejepld-1600387183686)(

解決:

其實類似這種情況的出現只有在規定鍊錶長度的時候才會使用,一般我們編寫佇列的時候,在資料量不是特別大的時候,不會規定佇列的大小,但是我們在特定情況下編寫就需要考慮這種情況的發生~

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-fihem1es-1600387183688)(

實現迴圈佇列時需要注意判斷迴圈佇列是否滿或者是否空,判斷佇列是否滿有兩種方法:

第二種方案其實需要判斷多個條件,網上一些**是有問題,希望火眼金睛~

這裡使用的第一種使用標記的方式標記了佇列空和滿的方式:

**實現以及測試:

cirque.h

#ifndef _cirque_h_

#define _cirque_h_

#include

#include

using

namespace std;

class

cirque

;#endif

cirque.cpp

#include

"cirque.h"

cirque::

cirque

(int size)

cirque::

~cirque()

bool cirque::

isempty()

void cirque::

clearque()

bool cirque::

isfull()

bool cirque::

insetque

(int val)

m_tail =

(m_tail+1)

% m_size;

m_pque[m_tail]

= val;

m_quenum++

; bempty =

false;if

(m_quenum == m_size)

return

true;}

bool cirque::

popque

(int

&val)

m_quenum--;if

(m_quenum ==0)

m_head =

(m_head+1)

% m_size;

val = m_pque[m_head]

;return

true;}

int cirque::

getnumque()

main.cpp

#include

"cirque.h"

intmain()

結果展示:

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-7p5ba8kf-1600387183689)(

gdb 多執行緒之旅

肝!動態規劃

c++使用鎖注意事項

嘔心瀝血的遞迴

muduo原始碼剖析學習總結

windows程式崩潰除錯終極**

看了《大道至簡》

無意間在網上翻到這本書,粗粗的看了一遍,有點感觸。可以研究細節,但不能陷入,可以一時陷入,但不能一世陷入。當然,這對技術狂熱者或許是除外的。如果要解決問題,那麼無論何種程式語言,都是一種工具,要做的是對於當前的問題選擇適合的工具。任何一種工具都是在某個情境下才可以區分孰優孰劣。中國的一些理論,很少放...

讀大道至簡

軟體開發 方法 過程 工程 組織 演算法 結構 方法 面向過程 物件導向 過程 瀑布模型 迭代模型 工程 專案管理 進度 成本 質量 組織 體制 組織結構和制度 是乙個向外擴充套件的過程。方法 分,模組化設計 過程 增量迭代,還是瀑布模型 工程 進度 成本 質量 組織 組織結構 制度 舉乙個做生意的...

大道至簡Segment Routing

聽了一下思科服務支援社群的講座,以下為筆記 1.基礎知識 1 igp基礎 ospf和中間到中間系統協議 2 bgp基礎 3 mpls 多協議標籤交換 2.模擬器為ios xrv 6.0.1 3.sr架構基於源路由。節點擊擇路徑,並且引導資料報沿著該路徑通過網路,做法是在資料報頭中插入帶順序的段列表,...