【发布时间】:2020-11-26 07:26:03
【问题描述】:
我正在尝试实现自己的矢量类(用于学习目的)。目前我被困在vector::clear(),我该如何实现它?不可能是这样吧?
void clear() {
for (size_t i = 0; i < _size; ++i) {
_data = 0;//can't work with custom class
}
}
或者
void clear() {
delete[] _data;
_data = new T[_cap];
_size = 0;
}//can we make it better?
或者简单到:
void clear() {
_size = 0;//fastest, but user can still access the data
}
T& operator[](size_t pos) {
if (pos >= _size) throw;//added to prevent from accessing "cleared" data
return _data[pos];
}
对libcxx进行了一些挖掘,发现他们使用alloc_traits::destroy,这会破坏_data中的每个元素???
这是我的类属性
T* _data;
size_t _size;
size_t _cap;
【问题讨论】:
-
如果您的目标是学习如何制作一些没有花里胡哨的东西,我通常不推荐标准库实现。与许多其他代码相比,它们具有非常特殊的要求,当您还不是专家时,这通常会使事情变得更加不堪重负。您将真正了解所有细节,但这在早期并不那么有用。
-
请注意,在 C++20 之前,您不能可移植地重新实现
std::vector,迭代器/引用失效要求与没有 implicit object creation 的data上的要求不兼容 -
@Caleth afaik “为低级对象操作隐式创建对象”可追溯应用于所有标准。