myVector and myDeque
自己动手实现了一个c++ stl中的vector容器,利用三根指针实现,简单易懂,大部分功能都实现了,还请各位批评指正。
三根指针分别为start,finish,end_of_storage,用于控制vector的容量,程序包含丰富的测试用例。
废话不多说,直接上代码。
该代码为头文件的内容
#ifndef myVector_h
#define myVector_h
template <typename T>
class myVector {
public:
myVector() {
start = new T[10];
finish = start;
end_of_storage = start + 10;
}
myVector(int n, T value) { //构造函数,n个值为value的元素
start = new T[n];
finish = start + n; //超尾位置
end_of_storage = start[n];
for (int i = 0; i < n; i++) {
start[i] = value;
}
}
myVector(int capacity) { //构造函数
start = new T[capacity];
finish = start;
end_of_storage = start + capacity;
}
myVector(const myVector& obj) { //拷贝构造函数
size_t n = obj.end() - obj.begin(); //个数
size_t capacity = obj.end_of_storage - obj.begin(); //容量
start = new T[n];
finish = start + n;
end_of_storage = start + capacity;
for (int i = 0; i < n; i++) {
start[i] = obj.start[i];
}
}
~myVector() { //析构函数
if (start) delete [] start;
}
myVector& operator=(const myVector& obj) { //重载赋值运算符
size_t n = obj.end() - obj.begin();
size_t capacity = obj.end_of_storage - obj.begin();
if (begin() == obj.begin()) return *this;
if (obj.begin() != NULL) {
T *ptemp = new T[capacity];
for (int i = 0; i < n; i++) {
ptemp[i] = obj.start[i];
}
start = ptemp;
finish = start + n;
end_of_storage = start + capacity;
}
return *this;
}
T* begin()const {return start;} //开始位置
T* end()const {return finish;} //结束位置
size_t size() {return size_t(end() - begin());} //数组大小
size_t capacity() {return size_t(end_of_storage - begin());} //容量
bool empty() {return begin() == end();}
T& operator[](size_t n) {return *(begin() + n);}
T& front() {return *begin();}
T& back() {return *(end() - 1);}
void display() {
if (empty()) {
cout << "vector为空!" << endl;
}
for (int i = 0; i < size(); i++) {
cout << start[i] << " ";
}
cout << endl;
}
void expansion() { //扩容
int n = 10;
end_of_storage += n; //一次扩容10个
}
bool push_back(T value) {
if (finish == end_of_storage) { //需要进行扩容
expansion();
}
size_t nsize = end() - begin();
start[nsize] = value;
finish += 1;
return true;
}
bool pop_back() {
if (empty()) {
cout << "myVector is empty!" << endl;
return false;
}
finish -= 1;
return true;
}
void insert(int npos, T value) { //插入元素
if (finish == end_of_storage) { //需要进行扩容
expansion();
}
finish += 1;
size_t n = size();
for (size_t i = n; i > npos; i--) {
start[i] = start[i-1];
}
start[npos] = value;
}
void insert(int npos, myVector<T> v) { //插入一个vector
size_t num = v.size();
if (finish - start + num > end_of_storage - start) { //扩容
expansion();
}
finish += num;
size_t n = size();
for (size_t i = n + num - 1; i > npos; i--) {
start[i] = start[i-num];
}
int cnt = 0;
for (size_t i = npos; i <= npos + num - 1; i++) {
start[i] = v[cnt++];
}
}
bool erase(int npos) { //删除指定位置的元素
if (empty()) {
cout << "myVector is empty!" << endl;
return false;
}
finish -= 1;
size_t n = size();
for (int i = npos; i < n - 1; i++) {
start[i] = start[i+1];
}
return true;
}
T& at(int npos) { //可以修改
return start[npos];
}
T findValue(T value) { //查找某元素,如果找不到,返回-1
size_t n = size();
for (int i = 0; i < n; i++) {
if (start[i] == value) {
cout << "找到值为" << value << "的元素!" << endl;
return value;
}
}
cout << "未找到该元素!" << endl;
return -1;
}
void sortmyVector() { //选择排序
size_t n = size();
for (int i = 0; i < n; i++) {
int minpos = i;
for (int j = i + 1; j < n; j++) {
if (start[j] < start[minpos])
minpos = j;
}
if (i != minpos) {
swap(start[i], start[minpos]);
}
}
}
void clear() {
if (start) {
finish = start;
}
}
private:
T *start;
T *finish;
T *end_of_storage;
};
#endif
部分测试结果截图:
完整代码链接🔗vector和deque,里面还包含一个vector和deque以及各种各样的测试用例,便于理解和学习,供有需要的同学参考。另外还有set和map,有需要的同学欢迎联系我