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]; // // 这里没必要调用构造函数,只需要分配空间即可。
阅读全文