2016-03-06 53 views
-2

在pop_back函数中,我想返回最后一个元素并将其删除。如果我尝试删除(m_array [m_size - 1]),我得到C2541:删除不能删除不是指针的对象。 什么是从数组中删除最后一个元素的正确方法?我正在用C++编写一个Vector类,使用数组。

template <typename T> 
class mvector 
{ 

private: 

    T *m_array; 
    int m_size; 
    int m_reserved_size; 


    public: 

     T pop_back(); // decrease length by 1, returning the value removed from the vector 

    }; 

    //Function Definition : 

    template <typename T> 
    T mvector<T>::pop_back() 
    { 
     delete(m_array[m_size - 1]); 
     m_size--; 
     return m_array[m_size - 1]; 

    } 
+0

难道你不能'm_size - '这会使它看起来像项目被删除。你真的不需要删除它吗? –

+0

是的,我想我会简单地做到这一点,并覆盖push_back()上的内容。这解决了它。 Thankyou –

+0

注意:这个'pop_back'不是异常安全的;如果在返回期间产生的'T'的副本抛出,则该元素不可挽回地丢失。出于这个原因,容器往往有'void pop_back()',调用者通过'back()'访问最后一个元素,然后在检索到值后调用'pop_back'。 –

回答

0

您的代码不正确,您正试图删除最后一项,然后缩小尺寸并返回新的最后一项。这将返回数组中的倒数第二项。

正确的方法是制作最后一个项目的副本,缩小尺寸,然后返回项目的副本。

template<typename T> 
T pop_back() 
{ 
    T ret = m_array[m_size - 1]; 
    m_size--; 
    return ret; 
} 

您不能减小动态分配数组的大小,它需要重新分配。

T* newArray = new T[m_size]; 
std::copy(m_array, m_array + m_size, newArray); 
delete[] m_array; 
m_array = newArray; 
0

目前没有办法部分返回分配的内存块;它是全部或没有。未来的C++标准(C++ 17)可能会改变这一点。

您必须分配一个正确大小的新块,将所有内容复制到您想要保留的位置,然后删除整个旧块。

相关问题