C ++向量实现错误

时间:2014-02-16 18:08:47

标签: c++ vector

我在C ++中创建了一个基本的矢量类,但尚未完成,但它是一个开始。我正在测试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();
}

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

memcpy(__data, _Rhs.__data, _Rhs.size());
你的assign运算符中的

应该是

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

答案 1 :(得分:0)

您的实施还有另一个问题。这就是push_back操作。

第一个问题是表现。您可以在每次插入时复制整个数组,使其成为O(n),这不是您应该拥有的。您可以通过例如在容器装满时将容器的大小加倍来解决此问题。

第二个错误是不应该使用realloc,memcpy和类似函数复制类对象,因为它会导致未定义的行为。在realloc的情况下,如果对象包含指向其自身某些部分的指针,该怎么办?你会打破它。

要解决此问题,您可以查看此内容

void* operator new(std::size_t size, void* ptr) noexcept;

名为展示位置新的新运算符的变体。您可以使用它来正确实现向量。