【问题标题】:pop_back function in custom vector class自定义向量类中的 pop_back 函数
【发布时间】:2021-04-26 18:22:48
【问题描述】:

所以我一直在看这个网站的代码:https://www.geeksforgeeks.org/program-to-create-custom-vector-class-in-c/。但是我在理解这部分时遇到了问题:

template <typename DT>
DT GenericMyVector<DT>::pop_back()
{
    return arr[length-- - 1];
}

我知道这会将int length 降低一,并且当您调用函数大小时,它会小一。但这是我的问题: - 1 做什么?由于数组的大小是固定的,这如何降低向量占用的内存量?最后一个元素究竟是如何被弹回的?

【问题讨论】:

  • 请注意,代码在演示自写向量的外观方面做得不好。有那么一刻,我想我必须改变我对 geeksforgeeks 的看法,但是对于自定义向量实现忽略 rule of 3/5 是不行的。我期待更多的细节问题
  • @largest_prime_is_463035818 您是否知道这些自定义向量类中有更好的示例?
  • 不幸的是没有。保持简单但同时又不会被严重破坏并不容易。我不介意他们只关注某些方面,但假装这是一个可用的向量是一个糟糕的笑话。这个笑话是在你身上的,初学者来到这个页面期待学习。看这里:godbolt.org/z/zda45fGfx。我在第 131 行删除了一个检查,以演示当我在第 173 行复制时会发生什么。然后我可以在一个不应该包含任何元素的向量中打印元素(第 181 行)。没有未定义行为的唯一原因是他们决定泄漏向量内存。好难过
  • 我碰巧在operator[]() 停止滚动。这几乎是恶意的,不利于学习。我从未信任过该网站,但我从未见过如此糟糕的事情。

标签: c++ oop vector


【解决方案1】:

length-- 计算为长度值(计算后递减)。所以你访问的项目是arr[length - 1]。您需要 -1,因为数组索引从零开始。

更容易将代码想象成:

template <typename DT>
DT GenericMyVector<DT>::pop_back()
{
    DT value = arr[length - 1];
    length--;
    return value;
}

【讨论】:

  • 这对弹出的向量的最后一个元素有何影响?弹出后内存中会发生什么?
  • @bb_823 所以这个pop_back 函数只是通过递减长度计数器从向量中“删除”项目。该项目本身仍保留在数组中。在下一次 push_back 调用时,数组中的该项将被覆盖。
  • 删除数组并在没有最后一个元素的情况下创建新数组并且大小减小一倍是否有效
  • @bb_823 不会。每次删除数组并用新数组替换时,您都会复制数组中的所有项目。考虑一个包含 100 个项目的向量,并在每个项目上调用 pop_back。您必须在第一个 pop 上复制 99 个项目,在第二个 pop 上复制 98 个项目,等等。总而言之,您将执行 5000 个副本。这是很多工作!现在有 1000 件物品呢?为此,您将复制 50 万个项目。 (如果您有兴趣,请查看“时间复杂度”和“大 O”符号)
  • 看看那个 g4g 教程中的 push_back 函数。他们通过在必要时将数组的大小加倍来避免这种大的“时间复杂度”。如果您想让矢量自动收缩,请考虑在长度小于容量一半时将其切成两半。
猜你喜欢
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2014-08-12
  • 2018-08-17
  • 2015-01-01
  • 2016-11-21
  • 2023-04-11
相关资源
最近更新 更多