#include <iostream> #include <cstdlib> #include <cstring> using namespace std; class Element { private: int number; public: Element() : number(0) { cout << "ctor" << endl; } Element(int num) : number(num) { cout << "ctor" << endl; } Element(const Element& e) : number(e.number) { cout << "copy ctor" << endl; } Element(Element&& e) : number(e.number) { cout << "right value ctor" << endl; } ~Element() { cout << "dtor" << endl; } void operator=(const Element& item) { number = item.number; } bool operator==(const Element& item) { return (number == item.number); } void operator()() { cout << number; } int GetNumber() { return number; } }; template<typename T> class Vector { private: T* items; int count; public: Vector() : count{ 0 }, items{ nullptr } { } Vector(const Vector& vector) : count{vector.count} { items = static_cast<T*>(malloc(sizeof(T) * count)); memcpy(items, vector.items, sizeof(T) * count); } Vector(Vector&& vector) :count{ vector.count }, items{ vector.items } { vector.items = nullptr; vector.count = 0; } ~Vector() { } T& operator[](int index){ if (index<0||index>=count) { cout<<"invalid index"<<endl; return items[0]; } return items[index]; } int returnCount(){ return count; } void Clear() { for (int i = 0; i < count; i++) { items[i].~T(); } count = 0; items = nullptr; } void Add(const T& item) { T* newItems = static_cast<T*>(malloc(sizeof(T) * (count + 1))); int i; for (i = 0; i < count; i++) { new(&newItems[i])T(move(items[i])); } new(&newItems[count])T(move(item)); for (int i = 0; i < count; i++) { items[i].~T(); } count++; items = newItems; } bool Insert(const T& item,int index) { if (index < 0 || index >= count) { return false; } T* newItems = static_cast<T*>(malloc(sizeof(T) * (count + 1))); int i; for (i = 0; i < index; i++) { new(&newItems[i])T(move(items[i])); } new(&newItems[index])T(move(item)); for (i = index; i < count; i++) { new(&newItems[i+1])T(move(items[i])); } for (i = 0; i < count; i++) { items[i].~T(); } count++; items = newItems; return true; } bool Remove(int index) { if (index < 0 || index >= count) { return false; } T* newItems = static_cast<T*>(malloc(sizeof(T) * (count - 1))); int i; for (i = 0; i < index; i++) { new(&newItems[i])T(move(items[i])); } for (i = index + 1; i < count; i++) { new(&newItems[i-1])T(move(items[i])); } for (i = 0; i < count; i++) { items[i].~T(); } count--; items = newItems; return true; } int Contains(const T& item) { for (int i = 0; i < count; i++) { if (items[i] == item) { return i; } } return -1; } }; template<typename T> void PrintVector(Vector<T>& v) { int count = v.returnCount(); for (int i = 0; i < count; i++) { v[i](); cout << " "; } cout << endl; } int main() { Vector<Element> v; for (int i = 0; i < 4; i++) { Element e(i); v.Add(e); } PrintVector(v); Element e2(4); if (!v.Insert(e2, 10)) { v.Insert(e2, 2); } PrintVector(v); if (!v.Remove(10)) { v.Remove(2); } PrintVector(v); Element e3(1), e4(10); cout << v.Contains(e3) << endl; cout << v.Contains(e4) << endl; Vector<Element> v2(v); Vector<Element> v3(move(v2)); PrintVector(v3); v2.Add(e3); PrintVector(v2); return 0; }
output:
ctor copy ctor dtor ctor right value ctor copy ctor dtor dtor ctor right value ctor right value ctor copy ctor dtor dtor dtor ctor right value ctor right value ctor right value ctor copy ctor dtor dtor dtor dtor 0 1 2 3 ctor right value ctor right value ctor copy ctor right value ctor right value ctor dtor dtor dtor dtor 0 1 4 2 3 right value ctor right value ctor right value ctor right value ctor dtor dtor dtor dtor dtor 0 1 2 3 ctor ctor 1 -1 0 1 2 3 copy ctor 1 dtor dtor dtor