代码之家  ›  专栏  ›  技术社区  ›  Bhupesh Pant

当堆栈为空时,在(模板化的)堆栈pop方法中要做什么?

  •  0
  • Bhupesh Pant  · 技术社区  · 7 年前

    我已经编写了一个模板化容器类,它接受模板参数的类型和模板。

    template<class type, template<typename...> class Seq>
    class stack1
    {
    private:
        int count;
        int size;
        Seq<type> st;
        //Seq<string> str;
    
    public:
        stack1(size_t size):size(100), count(-1){ }
        void push(type elem);
        type pop();
    
    };
    
    
    template<class type, template<typename...> class Seq>
    type stack1<type, Seq>::pop()
    {
        if (count < 0)
        {
            cout << "stack1 is empty," << endl;
            /*How to handle this condition.*/
    
        }
        else
        {
            type elem; 
            elem = st.back();
            st.pop_back();
            count--;
            return elem;
        }
    }
    

    我的问题是,在pop函数中,当容器对象为空时,我应该如何处理错误场景。我想返回一些默认值, 例如,如果容器是int,则为0/-1;如果容器是string,则为“/null”;如果容器是float,则为0.0……差不多吧。

    2 回复  |  直到 7 年前
        1
  •  3
  •   einpoklum    7 年前

    @rsahu的建议很好。

    另一种方法是更改 pop() 功能来源:

    type pop();
    

    std::optional<type> pop();
    

    然后回来 std::nullopt 如果堆栈为空,或在通常情况下为包装值:

    if (count < 0) {
        return std::nullopt;
    }
    

    请注意 std::optional 在C++ 17语言标准中介绍;在C++ 14中,它具有 std::experimental::optional ,或者您可以使用 boost::optional 对于C++ 11和更早的。

    注:当元素计数实际上为0时,将count设为-1是个坏主意-非常混乱!

        2
  •  3
  •   R Sahu    7 年前

    处理它的一种方法是抛出一个异常。

    if (count < 0)
    {
        throw std::out_of_range("stack1 is empty");
    }
    

    我强烈反对使用 std::cout 把信息打印到那个地方的终端上。使用 STD:: 在数据结构的实现中是一个糟糕的编程实践。