有没有办法检查标准库C++的队列何时满? 标准C++库中,STD::队列在满时没有检查功能。 有没有办法知道它什么时候满了? 如果没有,是否有一种方法可以像队列限制n个元素那样限制其元素?

有没有办法检查标准库C++的队列何时满? 标准C++库中,STD::队列在满时没有检查功能。 有没有办法知道它什么时候满了? 如果没有,是否有一种方法可以像队列限制n个元素那样限制其元素?,c++,data-structures,queue,C++,Data Structures,Queue,std::queue容器适配器没有导出此内容的成员函数。但是,默认情况下,std::queue包装一个std::deque,它有一个成员函数max_size,返回deque支持的最大大小。如果需要使用此功能,可以切换并使用deque而不是queue 需要注意的是,大多数deque::max_size的实现只会返回用于编码大小的整数类型的最大值,这可能比deque中的实际值大得多。如果使用C++的嵌入式版本,库实现者可能会以不同的方式实现Max大小,但是除非有一些实现特定的文档,否则不应该依赖于此

std::queue容器适配器没有导出此内容的成员函数。但是,默认情况下,std::queue包装一个std::deque,它有一个成员函数max_size,返回deque支持的最大大小。如果需要使用此功能,可以切换并使用deque而不是queue

需要注意的是,大多数deque::max_size的实现只会返回用于编码大小的整数类型的最大值,这可能比deque中的实际值大得多。如果使用C++的嵌入式版本,库实现者可能会以不同的方式实现Max大小,但是除非有一些实现特定的文档,否则不应该依赖于此。通常,std::deque只是随着元素的添加而动态增长,当没有更多内存可用时,它会达到最大值,而不是在大小上设置硬上限。

std::队列容器适配器没有导出此值的成员函数。但是,默认情况下,std::queue包装一个std::deque,它有一个成员函数max_size,返回deque支持的最大大小。如果需要使用此功能,可以切换并使用deque而不是queue

需要注意的是,大多数deque::max_size的实现只会返回用于编码大小的整数类型的最大值,这可能比deque中的实际值大得多。如果使用C++的嵌入式版本,库实现者可能会以不同的方式实现Max大小,但是除非有一些实现特定的文档,否则不应该依赖于此。通常,std::deque只是随着元素的添加而动态增长,当没有更多内存可用时,它会达到最大值,而不是在大小上设置硬上限

当基础容器无法分配内存以插入新元素时,std::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";
}
当基础容器无法分配内存以插入新元素时,std::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";
}

你说满是什么意思?它是动态增长的。除非内存耗尽,否则队列永远不会满。如果你想限制尺寸,你必须把它包起来。如果大小>最大值//什么都不做,它永远不会填满。如果系统运行物理内存来分配空间,它将抛出std::bad_ALLOC full是什么意思?它是动态增长的。除非内存耗尽,否则队列永远不会满。如果你想限制尺寸,你必须把它包起来。如果大小>最大值//什么都不做,它永远不会填满。如果系统运行物理内存来分配空间,它将抛出std::bad_alloc。我认为您不应该抛出std::bad_alloc。它有一个非常具体的含义,如果堆栈上更高的一个帧捕捉到它,它可能会错误地对它执行操作。我想std::out_of_range或类似的东西会更安全。@u标记为True,但作为现有默认std::queue的即插即用替换,bad_alloc将被现有的异常处理程序捕获。如果这不是你想要的行为,OP可以定制它。我认为你不应该抛出std::bad_alloc。它有一个非常具体的含义,如果堆栈上更高的一个帧捕捉到它,它可能会错误地对它执行操作。我想std::out_of_range或类似的东西会更安全。@u标记为True,但作为现有默认std::queue的即插即用替换,bad_alloc将被现有的异常处理程序捕获。如果这不是想要的行为,OP肯定可以定制它。