C++ 对于向量类C+,返回并擦除+;

C++ 对于向量类C+,返回并擦除+;,c++,arrays,templates,vector,C++,Arrays,Templates,Vector,我正试图写回pop_并删除向量类的成员函数。然而,我意识到我不能使用删除。有没有关于如何去除元素的建议 template <class T> class Vector{ private: int current_size, capacity; T* arr; public: Vector(); unsigned int size(); void grow(); void push_back(const T& elt); void pop_back(); T& at

我正试图写回pop_并删除向量类的成员函数。然而,我意识到我不能使用删除。有没有关于如何去除元素的建议

template <class T>
class Vector{
private:
int current_size, capacity;
T* arr;

public:

Vector();
unsigned int size();
void grow();
void push_back(const T& elt);
void pop_back();
T& at(int pos);
T& front();
T& back();
bool empty();
void insert (const T&elt, int pos);
void erase(int pos);
Vector<T>& operator=(const Vector& v);
T& operator[](int n);

};

template <class T>
void Vector<T>::pop_back(){
if(!empty()){
    delete arr[current_size-1];
    current_size--;
    }
 }

template <class T>
void Vector<T>::erase(int pos){
if(!empty() && pos>=0 && pos<current_size) {
    for (int i=pos; i<(current_size-1); i++){
        arr[i]=arr[i+1];
    }
    delete arr[current_size-1];
    current_size--;
 }
}
模板
类向量{
私人:
int当前_大小、容量;
T*arr;
公众:
向量();
无符号整数大小();
空洞生长();
无效推回(常数T和elt);
void pop_back();
电话电报(国际邮政局);
T&front();
T&back();
bool empty();
无效插入(常量T&elt,内部位置);
无效擦除(int-pos);
向量和运算符=(常量向量和v);
T&operator[](国际编号);
};
模板
void Vector::pop_back(){
如果(!empty()){
删除arr[当前_大小-1];
当前_大小--;
}
}
模板
无效向量::擦除(int-pos){

如果(!empty()&&pos>=0&&pos要对未分配常规
new
的对象调用析构函数,您将执行以下操作:

arr[current_size-1].~T();
请记住,在分配数组中的对象时,您可能还希望确保对它们调用placement
new
,否则您将处理未初始化的对象。例如:

new (&arr[some_index]) T();

(您需要包含头文件
才能执行此操作)

若要在未分配常规
的对象上调用析构函数,请执行以下操作:

arr[current_size-1].~T();
请记住,在分配数组中的对象时,您可能还希望确保对它们调用placement
new
,否则您将处理未初始化的对象。例如:

new (&arr[some_index]) T();

(您需要包含头文件
才能执行此操作)

为什么要
删除
向量中的最后一个元素而不是要删除的元素,即
arr[pos]
Vector::erase()中循环之前
?你是如何意识到你不能使用delete的?编译错误?运行时错误?主管告诉你的?@MikeCAT第一个问题:因为他只是把它们移了一个位置。第二个问题:可能是编译错误,因为
arr[current\u size-1]
不是指针。您可以使用placement new和delete进行此操作。这取决于您如何实现
grow
。这可能也会遇到问题。正确编写向量样式容器不是一项简单的任务。为什么要
删除
向量中的最后一个元素,而不是要删除的元素,即。
arr[pos]
Vector::erase()
中的循环之前?您是如何意识到您不能使用delete的?编译错误?运行时错误?由主管告知的?@MikeCAT第一个问题:因为他只是将它们移动了一个。第二个问题:可能是编译错误,因为
arr[current\u size-1]
不是指针。你可以使用placement new和delete来实现它。这取决于你如何实现
grow
。这可能也会遇到问题。正确编写向量样式容器不是一项简单的任务。唯一的问题是,你还必须自己创建析构函数。因此,这让我回到了同样的问题如何去除这些元素的问题。我不理解这个问题。我发布的代码调用析构函数,然后你已经减少了向量上的大小变量。当然,你仍然分配了内存,但你没有使用它,这就是向量的工作方式。如果询问者正在使用
new t[],这是一个糟糕的建议
delete[]
分配和删除数组。如果他这样做,那么他会遇到更大的问题。使用
new T[]
将立即构造对象,这不是你想要的向量。只需提供一个更大的图片:如果你想让你的代码像向量一样工作,你1)分配原始内存,2)使用placement
new
将对象构造到该内存中。3)通过单独调用对象的析构函数来销毁对象。4)销毁包含的所有对象后释放整个原始内存块。如果需要,可以直接或通过分配器对象来执行这些操作(这就是
std::vector
所做的)。唯一的问题是我自己也必须创建析构函数。这让我回到了如何去除这些元素的问题。我不明白这个问题。我发布的代码调用析构函数,然后你已经使用的代码减少了向量上的大小变量。当然,你仍然有分配的内存,但是你没有使用它,这就是向量的工作方式。如果询问者使用
new T[]
delete[]
来分配和删除数组,这是一个糟糕的建议。如果他这样做,那么他会遇到更大的问题。使用
new T[]
将立即构造对象,这不是你想要的向量。只需稍微放大一点:如果你想让你的代码表现得像向量,你需要1)分配原始内存,2)使用placement
new
将对象构造到该内存中。3)通过单独调用对象的析构函数来销毁对象。4)销毁包含的所有对象后释放整个原始内存块。如果需要,可以直接或通过分配器对象来执行这些操作(这就是
std::vector
所做的)。