C语言如何自定义Vector实现查询?
摘要:#include<iostream> #include<string> template<typename T&g
#include<iostream>
#include<string>
template<typename T>
class Vector {
private:
size_t m_Size = 0;
size_t m_Capacity = 0;
T* m_Data = nullptr;
public:
Vector() {
ReAlloc(2);
}
~Vector() {
//清除内置数据空间
//delete[] m_Data;
//方法里会手动调用清除元素对象的析构函数
clear();
//删除对象时,不会调用对象的析构函数,将对象的析构函数的调用全部在clear() 函数中统一处理
::operator delete(m_Data, m_Capacity * sizeof(T));
}
//添加数据
void PushBack(const T& value) {
if (m_Size >= m_Capacity)
ReAlloc(m_Capacity + m_Capacity / 2);
// = 操作符被删除时,此句不可用, 教学视频中可用,此处打问号❓️
//m_Data[m_Size] = value;
//自定义适配
m_Data[m_Size] = (T&&)value;
m_Size++;
}
//移动数据,不涉及到copy,注意:临时变量前面不能+ const
void PushBack(T&& value) {
if (m_Size >= m_Capacity)
ReAlloc(m_Capacity + m_Capacity / 2);
m_Data[m_Size++] = std::move(value);
}
//可变参数元素添加
template<typename... Args>
T& EmplaceBack(Args&&... args) {
if (m_Size >= m_Capacity) {
ReAlloc(m_Capacity + m_Capacity / 2);
}
//这个性能更优越,不会调用move= ! 和 Destroy !
new(&m_Data[m_Size]) T(std::forward<Args>(args)...);
//这个会调用一次:move= ! 和 Destroy !
//m_Data[m_Size] = T(std::forward<Args>(args)...);
return m_Data[m_Size++];
}
//显示调用弹出的元素对象的析构函数
void PopBack() {
if (m_Size > 0) {
m_Size--;
m_Data[m_Size].~T();
}
}
//显示调用所有清除元素对象的析构函数
void clear() {
for (size_t i = 0; i < m_Size; i++)
m_Data[i].~T();
m_Size = 0;
}
size_t Size() const { return m_Size; }
const T& operator[] (size_t index) const {
if (index >= m_Size) {
//assert();
}
return m_Data[index];
}
T& operator[] (size_t index) {
if (index >= m_Size) {
//assert();
}
return m_Data[index];
}
private:
//重新分配内存,所以,无论新的size是 > < = ,都将reSize
void ReAlloc(size_t newCapacity) {
//1. allocate a new block of memory
//2. copy/move old block elements
//3. delete old elements
//T* newBlock = new T[newCapacity];
//
// 这里没必要调用构造函数,只需要分配空间即可。
