代码之家  ›  专栏  ›  技术社区  ›  skr

输出语句的C++顺序不一致[重复]

  •  0
  • skr  · 技术社区  · 7 年前

    #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";
    }
    

    我的问题主要在于以下陈述:

    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 . 请提供指导。

    1 回复  |  直到 7 年前
        1
  •  4
  •   James Aylett    7 年前

    std::cerr std::cout ,它们是不同的流。特别地, cerr cout 通常是缓冲的(直到缓冲区满了才会输出)。

    公认的答案 this question