簡體   English   中英

有沒有辦法檢查標准庫 c++ 中的隊列何時已滿?

[英]Is there a way to check when a queue from a standard library c++ is full?

在標准 C++ 庫中, std::queue沒有檢查是否已滿的功能。

  1. 有沒有辦法知道它什么時候滿了?
  2. 如果沒有,有沒有辦法限制它的元素(比如隊列限制n個元素)?

std::queue容器適配器沒有導出它的成員函數。 然而, std::queue默認包裝一個std::deque ,它有一個成員函數max_size()返回deque的最大支持大小。 如果您需要使用此功能,您可以切換並使用deque而不是queue

請注意,大多數deque::max_size的實現只會返回用於編碼大小的整數類型的最大值,這可能比您實際可以放入deque的值大得多。 如果您使用的是 C++ 的嵌入式版本,則庫實現者可能以不同方式實現了max_size ,但您不應該依賴它,除非您有一些特定於實現的文檔。 通常, std::deque只是隨着元素的添加而動態增長,並在沒有更多內存可用時達到最大值,而不是對大小設置硬上限。

  1. 當其底層容器無法分配內存以插入新元素時, std::queue已滿。
  2. 您必須自己制作,方法是:
    • 實施一個能夠施加限制並在您的queue中使用它的容器。
    • 繼承std::queue並將限制放在那里。
    • 將隊列(組合)包裝在一個隱藏對隊列的直接訪問並施加限制的類中。

這是實施施加限制的容器的基本示例。 您還需要實施emplace_back等才能真正發揮作用。

#include <iostream>
#include <new>
#include <queue>
#include <stdexcept>

// cheating by inheriting from std::deque
template<typename T, std::size_t max>
struct limited_deque : std::deque<T> {
    using std::deque<T>::deque;

    // the limit imposing push_back
    void push_back(const T& value) {
        if(this->size() == max) throw std::bad_alloc();
        // call the base class push_back
        std::deque<T>::push_back(value);
    }
};

// convenience alias
template<typename T, std::size_t max>
using limited_queue = std::queue<T, limited_deque<T, max>>;

int main() {
    limited_queue<int, 5> x;
    std::cout << "queue size : " << x.size() << "\n";

    try {
        for(int i = 0; i < 10; ++i) x.push(i);
    } catch(const std::exception& ex) {
        std::cout << ex.what() << "\n";
    }
    std::cout << "queue size : " << x.size() << "\n";
}

很可能的輸出:

queue size : 0
std::bad_alloc
queue size : 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM