C++ vector 实现错误

标签 c++ vector

我用 C++ 做了一个基本的 vector 类,这还没有完成,而是一个开始。我在测试 operator= 函数时发现了一个问题——[大部分] 传递的值都是错误的。

期望的输出:

12345678910

12345678910

实际输出:

12345678910

12-842203133-842150451-842150451-842150451-842150451-842150451-842150451-8421504 51

template < typename _Ty > class vector
{
public:
    typedef _Ty *iterator;
    typedef vector<_Ty> _Myt;
    vector() : __size(0), __data((_Ty *)calloc(1, sizeof(_Ty))){}
    vector(_Myt &_Rhs)
    {
        __data = (_Ty *)malloc((__size = _Rhs.size()) * sizeof(_Ty));
        memcpy(__data, _Rhs.__data, _Rhs.size());
    }
    ~vector(){ free(__data); }
    _Myt &push_back(const _Ty &_Rhs)
    {
        __data = (_Ty *)realloc(__data, ++__size * sizeof(_Ty));
        __data[__size - 1] = _Rhs;
        return *this;
    }
    size_t size() const
    {
        return __size;
    }
    iterator begin() const
    {
        return &__data[0];
    }
    iterator end() const
    {
        return &__data[__size];
    }
    _Myt &operator=(_Myt &_Rhs)
    {
        __data = (_Ty *)realloc(__data, (__size = _Rhs.size()) * sizeof(_Ty));
        memcpy(__data, _Rhs.__data, _Rhs.size());
        return *this;
    }
private:
    _Ty *__data;
    size_t __size;
};

int main()
{
    vector<int> v, v1;
    for (int i = 1; i <= 10; ++i)
    {
        v1.push_back(i);
    }
    for (vector<int>::iterator i = v1.begin(); i != v1.end(); ++i)
    {
        std::cout << *i;
    }
    std::cout << "\n";
    v = v1;
    for (vector<int>::iterator i = v.begin(); i != v.end(); ++i)
    {
        std::cout << *i;
    }
    getchar();
}

我的代码有什么问题?

最佳答案

memcpy(__data, _Rhs.__data, _Rhs.size());

在你的赋值运算符中应该是

memcpy(__data, _Rhs.__data, _Rhs.size() * sizeof(_Ty));

关于C++ vector 实现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21815296/

相关文章:

algorithm - 矢量点积计算的时间和空间复杂度

c++ - 处理曲面 vector 时如何正确使用 SDL_FreeSurface

c++ - Visual Studio 2012 中的 Visual C++ 使用 XAML

javascript - 如何在c++中使用html、javascript

python - Dicom 变形图像配准

java - 计算 vector int[]中 "0"位置之间的 "1"位置总数

Java 泛型 : Is there a better solution than Vector2D, Vector3D、Vector4D 等?

c++ - 如果从二进制文件加载,OpenCL 会导致 CL_INVALID_COMMAND_QUEUE

c++ - 如何将函数作为参数传递?

c++ - array, std::list, std::vector 插入时间