我有以下队列的实现:
#include <iostream>
#include <memory>
#include <cstddef>
template<typename T>
class Queue
{
std::unique_ptr<T[]> q_ptr;
int front_idx = -1;
int back_idx = -1;
int capacity = 0;
public:
Queue(std::size_t space)
{
q_ptr = std::unique_ptr<T[]>(new T[space]);
capacity = space;
}
void push(T value);
void pop();
T front() const;
T back() const;
std::size_t size() const;
};
template<typename T>
void Queue<T>::push(T value)
{
if(front_idx == -1)
{
front_idx++;
}
if(back_idx - front_idx + 1 == capacity)
{
std::cerr << "Queue full\n";
return;
}
q_ptr[++back_idx] = value;
}
template<typename T>
void Queue<T>::pop()
{
if(front_idx == -1)
{
std::cerr << "Empty queue\n";
return;
}
q_ptr[front_idx++] = T{};
}
template<typename T>
T Queue<T>::front() const
{
return q_ptr[front_idx];
}
template<typename T>
T Queue<T>::back() const
{
return q_ptr[back_idx];
}
template<typename T>
std::size_t Queue<T>::size() const
{
if(front_idx == -1)
{
return 0;
}
else
{
return back_idx - front_idx + 1;
}
}
int main()
{
Queue<int> q1{20};
std::cout << "Queue size initial: " << q1.size() << "\n";
q1.pop();
for(int i = 0; i < 23; i++)
{
q1.push(i);
}
std::cout << "Queue size: " << q1.size() << "\n";
std::cout << "Queue front: " << q1.front() << "\n";
std::cout << "Queue back: " << q1.back() << "\n";
q1.pop();
std::cout << "Queue size: " << q1.size() << "\n";
std::cout << "Queue front: " << q1.front() << "\n";
q1.pop();
std::cout << "Queue size: " << q1.size() << "\n";
std::cout << "Queue front: " << q1.front() << "\n";
q1.push(12);
std::cout << "Queue size: " << q1.size() << "\n";
std::cout << "Queue back: " << q1.back() << "\n";
}
我的问题是 main 中的以下语句:
std::cout << "Queue size initial: " << q1.size() << "\n";
当我运行代码时,上面的语句在大多数情况下都会打印在正确的位置(即作为输出中的第一行)。但有时,它会在pop()
和for
循环之后打印,如下所示:
Empty queue
Queue full
Queue full
Queue full
Queue size initial: 0
Queue size: 20
Queue front: 0
Queue back: 19
Queue size: 19
Queue front: 1
Queue size: 18
Queue front: 2
Queue size: 19
Queue back: 12
我试图找出这种不一致行为的原因。我使用Eclipse Cpp Photon IDE
带minGW GCC
。请提供指导。
空队列和满队列消息被写入std::cerr
not std::cout
,它们是不同的流。特别是,cerr
通常是无缓冲的(即,当您写入时,每一行将立即输出),cout
通常是缓冲的(直到缓冲区已满才会输出)。
这个问题的公认答案讨论了缓冲的一些细节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句