如何为vector复制构造器?

问题描述 投票:1回答:2

我模拟了一个向量,但是构造函数不起作用;当我调用pop()函数时,它会将垃圾值分配给矢量类中的旧对象。

    vector(vector &v) {
        vec = new T[v.size()];
        memcpy(vec, v,v.size());
        size_arr = v.size();
    }

这里是完整代码:

#include <iostream>
using namespace std;

template <typename T>
class vector {
    int size_arr;
    T * vec = new T;
public:
    vector(/*int _size*/) {
        vec = new T[0];
        size_arr = 0;
    };
    ~vector() {
        size_arr = 0;
        delete[] vec;
    };
    vector(vector &v) {
        vec = new T[v.size()];
        memcpy(vec, v,v.size());
        size_arr = v.size();
    }
void push_back(T data) {
    T *temp = new T[size_arr + 1];
    for (int i = 0; i < size_arr; i++)
        temp[i] = vec[i];
    temp[size_arr] = data;
    size_arr++;
    delete[] vec;
    vec = temp;
};
void push_front(T data){
    int j;
    T *temp = new T[size_arr + 1];
    for ( j = size_arr; j >= 0;j--) {
        temp[j + 1] = vec[j];
    }
    temp[0] = data;
    delete[] vec;
    vec = temp;
    size_arr++;
};
void insert(int index, T data) {
    int j;
    T *temp = new T[size_arr + 1];
    for (int i = 0; i < size_arr ;i++)
        temp[i] = vec[i];
    for (int i = 0; i < size_arr;i++) {
        if (i == index) {
            for ( j = size_arr; j >=i;j--) {
                temp[j+1] = vec[j];
            }
            temp[j + 1] = data;
            delete[] vec;
            vec = temp;
            size_arr++;
        }
    }
};
void pop() {
    T *temp = new T[size_arr - 1];
    for (int i = 0; i < size_arr-1;i++)
        temp[i] = vec[i];
    size_arr--;
    delete[] vec;
    vec = temp;
};
void Delete(int index) 
{
    T *temp = new T[size_arr - 1];
    for (int i = 0; i < index;i++) 
        temp[i] = vec[i];
    for (int i = 0; i < size_arr;i++) {
        if (i == index) {
            for (int j = i; j < size_arr-1;j++) {
                temp[j] = vec[j + 1];
            }
            size_arr--;
            delete[] vec;
            vec = temp;
        }
    }
};
int search(T data) {
    for (int i = 0; i < size_arr;i++) {
        if (vec[i] == data) {
            return i;
        }
    }
    return -1;
};
int size() { return size_arr; };
};

int main() {
    vector <int>test;
    test.push_front(2);
    test.push_front(3);
    test.push_back(0);
    test.push_back(-1);
    test.insert(2, 2);
    test.pop();

    vector <int > test1;
    test1 = test;//  problem
    test1.pop();

}
c++ function vector copy-constructor assign
2个回答
1
投票

问题是test1 = test;// problem行,它不调用复制构造函数,而是调用赋值运算符。您没有声明此运算符,因此编译器将使用默认实现,该实现只是复制所有成员。因此,分配后,test1.vectest.vec指向相同的存储位置。

当您将行(及其上方的一行)更改为vector <int > test1{test};时,它将调用您的副本构造函数。

您也忘记了#include <cstring>memcpy,您不应该将其用于非POD类型。

您必须将memcpy中的大小乘以sizeof(T),因为memcpy适用于字节,而不适用于类型。您还必须使用v.vec而不是v

这里是固定版本:https://ideone.com/JMn7ww


0
投票

我认为问题出在您的复制运算符中。您使用memcpy()这是一个c函数。它本身不应该是一个问题(除了在很多观点上不是那么好)。但是由于memcpy()是c函数,所以它不了解类型,并且将其大小参数作为字节数。

您放入的元素是int,可能是4个字节。因此,当您的复制构造函数被调用且原始结构具有3个元素时,数组中将有12个字节,但是malloc将仅复制其中3个字节。

其他人关于不正确复制模板类型的评论是正确的,因此,如果您创建字符串向量,则不能仅将其存入内存,并假定结果将是新字符串。对于这个答案,我假设您仅使用基本类型作为模板参数,例如int或double。

© www.soinside.com 2019 - 2024. All rights reserved.