2013-09-29 48 views
0

所以我想实现我的Vectorpop_back()功能,但我没有得到预期的结果:自定义矢量pop_back功能

这是我当前的功能:

template <typename T> 
void Vector<T>::pop_back() { 
    if(vsize > 0){ 
     array[vsize].~T(); 
     --vsize; 
    } 
} 

为什么没有按这是否删除数组中的最后一个元素?

这里是我的.h

template <typename T> 
class Vector { 

public: 

    Vector(); 
    ~Vector(); 
    void push_back(const T &e); 
    int size() const; 
    void pop_back(); 
    void allocate_new(); 
    T operator[](int index); 

private: 

    Vector(const Vector<T> & v); 
    Vector<T> & operator=(const Vector<T> &); 
    int vsize; 
    int capacity; 
    T* array; 

}; 
+0

是你的'数组'索引从1开始? –

+0

它从0开始。 –

+0

然后它应该是'if(vsize> = 0)'。 – 0x499602D2

回答

2

调用数组中对象的析构函数不会对数组做任何事情,除非将数组的元素置于有趣状态。特别是,如果做这样的事情:

T* array = new T[2]; 
array[1].~T(); 
delete[] array; // ERROR: double destruction 

如果不先恢复被破坏的数组元素,你根本无法摆脱数组。

“真正的”实现处理这种情况的方式是分配原始内存,例如使用void* memory = operator new[](size);(使用合适的size),或者如果它是标准C++库容器,则使用合适的分配器函数分配原始内存。容器根据需要构造和破坏内存中的对象。被破坏的内存中的实际表示可能仍然不会真正改变,因为大多数析构函数只是摆脱了所有占用的资源,并且保持对象中的位不变,从而使外观看起来好像内存中存在生命对象,尽管不是。

2

数组的最后一个元素将是array[vsize - 1]

+0

我改变了代码来解释这一点,因为你是正确的,但我的功能仍然没有删除最后一个元素。我是否错误地使用了析构函数? –

+0

凭借'vsize'少一个而被“删除”。当你push_back()另一个项目时,它会覆盖刚删除的元素。这就是'std :: vector'的工作方式。 – Ferruccio

1

除非是使用placement-new表达式创建的,否则不应该调用对象的析构函数。你应该做的是减小尺寸并保持实际的物体不变。除非它具有动态存储持续时间,在这种情况下请拨打delete/delete[]

+0

所以我应该在函数中执行'--vsize'并将其保留? –

+0

@ConnorBlack这将是最简单的路线。 Dietmar展示了更先进的解决方案。 – 0x499602D2