我在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();
}
我的代码出了什么问题?
答案 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;
名为展示位置新的新运算符的变体。您可以使用它来正确实现向量。