#ifndef MYVECTOR_H
#define MYVECTOR_H
#include <iostream>
#include <cstring>
using namespace std;
//自定義的容器類
template<typename T>
class MyVector
{
public:
MyVector();
MyVector(int len, T element); //填充len長度的元素element
MyVector(const MyVector<T>& vec); //復制構造
virtual ~MyVector();
template<typename T2>
friend ostream& operator<<(ostream& out, const MyVector<T2>& vec);
MyVector<T>& operator=(const MyVector<T>& vec);
protected:
private:
T* m_elements; //用來存放元素的陣列
int m_length; //所有存放元素的實際個數
int m_capacity; //當前元素陣列的大小
};
template<typename T>
MyVector<T>::MyVector() : m_capacity(16), m_length(0)
{
this->m_elements = new T[m_capacity];
}
template<typename T>
MyVector<T>::MyVector(int len, T element) : m_capacity(16)
{
m_capacity = len + m_capacity;
m_length = len;
m_elements = new T[m_capacity];
for (int i = 0; i < m_length; i++)
{
memcpy(&m_elements[i], &element, sizeof(T));
}
}
template<typename T>
MyVector<T>& MyVector<T>::operator=(const MyVector<T>& vec)
{
if (this == &vec)
return *this;
if (this->m_elements != nullptr)
{
delete[] this->m_elements;
this->m_elements = nullptr;
this->m_capacity = 16;
this->m_length = 0;
}
this->m_capacity = vec.m_capacity;
this->m_length = vec.m_length;
this->m_elements = new T[vec.m_capacity];
memcpy(m_elements, vec.m_elements, m_length * sizeof(T));
}
template<typename T>
MyVector<T>::MyVector(const MyVector<T>& vec)
{
this->m_capacity = vec.m_capacity;
this->m_length = vec.m_length;
this->m_elements = new T[vec.m_capacity];
memcpy(m_elements, vec.m_elements, m_length * sizeof(T));
}
template<typename T>
T& MyVector<T>::operator[](int index)
{
return m_elements[index];
}
template<typename T>
void MyVector<T>::push_back(T element)
{
if (nullptr == m_elements)
{
m_capacity = 16;
m_length = 0;
m_elements = new T[m_capacity];
}
//判斷當前的陣列是否已滿
if (m_length == m_capacity)
{
//如果滿了,就擴容:當前容量 * 2 + 1。也可擴容某個固定值,按實際需求
T* newElement = new T[m_capacity * 2 + 1];
//把原來的元素拷貝到新空間中
memcpy(newElement, m_elements, m_length * sizeof(T));
delete[] m_elements;
m_elements = newElement;
}
memcpy(&m_elements[m_length++], &element, sizeof(T));
}
template<typename T2>
ostream& operator<<(ostream& out, const MyVector<T2>& vec)
{
for (int i = 0; i < vec.m_length; i++)
{
out << vec.m_elements[i] << ", ";
}
out << endl;
return out;
}
template<typename T>
MyVector<T>::~MyVector()
{
delete[] m_elements;
}
#endif // MYVECTOR_H
//main.cpp
#include <iostream>
#include<cstring>
#include "MyVector.h"
using namespace std;
void TestVector();
int main()
{
TestVector();
return 0;
}
void TestVector()
{
MyVector<int> vec1;
cout << "vec1: " << vec1 << endl;
MyVector<double> vec2(10, 99.9);
cout << "vec2: " << vec2 << endl;
//MyVector<string> vec3(8, string("abc"));
//cout << "vec3: " << vec3 << endl;
//vec3.push_back("GHK");
//cout << "插入元素后\n" << "vec3: " << vec3 << endl;
MyVector<double> vec4(vec2);
cout << "vec4: " << vec2 << endl;
MyVector<double> vec5(20, 66.6);
cout << "vec5: " << vec5 << endl;
vec5 = vec2;
cout << "等號賦值vec5 = vec2,vec5:" << vec5 << endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/91661.html
標籤:C++ 語言
下一篇:為什么scanf被跳過了?
