【问题标题】:C++ - Order of output statements is inconsistent [duplicate]C ++ - 输出语句的顺序不一致[重复]
【发布时间】:2018-09-09 14:50:05
【问题描述】:

我有以下队列实现:

#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 IDEminGW GCC。请提供指导。

【问题讨论】:

  • 在逐行调试该代码时,您究竟观察到了什么?
  • cout 通常是缓冲的,cerr 通常不是。如果顺序很重要,请使用相同的流(或者禁用缓冲,或者可能在每行之后刷新)。
  • 我观察到在我到达for 循环之前输出没有出现在屏幕上。我一直使用std::endl。但最近改用\n,因为std::endl更贵。

标签: c++ queue output cout


【解决方案1】:

空的和满的队列消息被写入std::cerr 而不是std::cout,它们是不同的流。特别是,cerr 通常是无缓冲的(即,当您写入它时,每一行都会立即输出),而 cout 通常是有缓冲的(直到缓冲区满才会输出)。

this question 的公认答案详细讨论了缓冲。

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    相关资源
    最近更新 更多