【问题标题】:Why is there no clear() function for the inbuilt stack interface in C++?为什么 C++ 中的内置堆栈接口没有 clear() 函数?
【发布时间】:2021-05-28 15:12:40
【问题描述】:

我必须先清空一个堆栈,然后才能进一步使用它。我确实知道可以这样做:

while (!mystack.empty()) { mystack.pop(); }

没有这个功能有什么具体原因吗?或者只是第一次做的时候,没有人觉得它的要求,只是被排除在外

另外,Java 中的堆栈接口确实有一个clear() 函数。

【问题讨论】:

  • @molbdnilo:stack::clear 可能使用 OP 的实现而不需要容器中的额外成员,或者甚至可能在存在 clear() 方法时使用标签调度。

标签: c++ stack


【解决方案1】:

正如 cmets 中提到的 molbdnilo,您必须区分标准容器和容器适配器。 std::stack 是容器适配器,而不是容器。有几个原因,为什么这些适配器必须尽可能减少对所用内容器类型特性的假设。一个相关的问题是时间复杂度(理论上的,偶然的),例如,这里可能的底层容器之间可能会有很大差异。另一个相关方面可能是要求与并行工作环境(并行读取和写入)中的多个访问方案保持一致,尽管这可能与 clear-functionality 无关。

一般来说,它遵循一个简单的软件设计规则:不要夸大顶级接口,对可能的内部实现和可能的使用场景进行过多假设-特征。直接清除“抽象”堆栈可能会引起很多疑惑和容易出错的此类对象的误用,因为堆栈通常代表的不仅仅是简单的部分排序,它通常代表历史。从语义上讲,直接清除操作可以看作是对几个与堆栈相关的场景的设计攻击:“忘记我到目前为止对堆栈所做的和思考的事情,让我们尝试一些完全不同的东西......”因此,就此处提到的问题之间的比例而言,分配是更好的方法,因为您明确地引入了一个全新的对象(而前一个对象可能仍然存在于 shared_ptr 中,例如其他地方,如果需要,不受清除的影响)。

【讨论】:

    【解决方案2】:

    虽然有一个明确的.clear() 可能更具可读性,但即使没有它,您也可以像这样清空堆栈:

    mystack = {};
    

    【讨论】:

    • 哇,我试过了,它奏效了。你能分享一些关于为什么这个 (mystack = {};) 工作的信息吗? (这个问题可能很愚蠢,但我真的不明白这里发生了什么)
    • stack 是可赋值的,{} 将是一个默认构造的堆栈,所以是空的。
    • 我相信这里有更多合格的语言律师。我看到的是 {} 作为一个空的初始化列表。所以它构造了一个空的临时对象并将其分配给旧列表。
    【解决方案3】:

    运行while循环直到堆栈为空以弹出所有元素

    while(!stack.empty()){
        stack.pop();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2020-10-26
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多