【发布时间】:2020-03-24 14:58:47
【问题描述】:
我刚刚开始使用我的数据结构,并且正在实现某种数组列表 (~=std::vector)。我想知道如何实现 pop_back() 以使其具有恒定的复杂性?它必须将大小减小 1 并删除最后一个元素。现在我在某处看到它基本上将大小减小了 1 并通过一些迭代器/指针破坏了最后一个元素,但是为什么我们不能以相同的方式实现 pop_front() 并将指向第一个元素的指针重定向到下一个元素?
template <typename T>
ArrayList<T>& ArrayList<T>::pop_back()
{
--size_;
auto p = new T[size_];
std::copy(elements_,elements_+size_,p);
delete [] elements_; //elements_ being my pointer
elements_ = p;
return *this;
}
【问题讨论】:
-
您的问题是关于
pop_back()还是pop_front()? -
对于
pop_back(),您实际上不必删除/销毁最后一个元素。您可以只减少指向数组最后一个元素的指针或减少 size 成员(取决于您如何实现它)。为了pop_front(),您仍然需要减小大小,但是现在您必须将元素移到前面,或者增加前面的指针。再次取决于你的实施。关键是您不必特意删除元素。停止使用该元素。 -
FWIW,几个月前我读到一篇文章,关于像
vector这样的数据结构,它从中间增长,也支持快速前端操作,但这个名字让我忘记了。在这种情况下,您可以以大致相同的方式实现pop_front。 -
@LLSv2.0
pop_back()当然必须销毁最后一个元素。如果该元素具有析构函数,则要求析构函数运行并且元素的生命周期结束。 -
@chris 是std::deque。它不像向量那样连续,但具有随机访问和前后快速插入/删除的功能。