我刚开始学习数据结构,正在实现一种类似于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()
的? - JohnFilleaupop_back()
,您实际上不必删除/销毁最后一个元素。您只需将指针减少到数组的最后一个元素或减少大小成员(取决于您如何实现此操作)。为了pop_front()
,您仍然需要减小大小,但现在您必须将元素向前移动或增加前指针。同样取决于您的实现方式。重点是您不必费力去删除该元素。只需停止使用该元素即可。 - LLSv2.0pop_back()
一定要销毁最后一个元素。如果该元素有析构函数,则需要运行析构函数并结束元素的生命周期。 - François Andrieux