一个自己实现的Vector 完善版本
程序员文章站
2022-06-22 10:54:51
一个自己实现的Vector(只能处理基本类型数据) 转载自: https://www.ev0l.art/index.php/archives/22/ string 类型不行 bool char int double float long long 等基本类型可用 使用模板类实现。底层为数组实现。 d ......
一个自己实现的vector(只能处理基本类型数据)
转载自:
- string 类型不行
- bool char* int double float long long 等基本类型可用
使用模板类实现。底层为数组实现。
- dvector.h
#ifndef dvector_h #define dvector_h #pragma once #include <iostream> template <class t> class dvector { public: dvector(); ~dvector(); bool push_back(t); void show(); public: t* p; int len; int real_len; }; #endif // dvector_h
- dvector.cpp
#include "dvector.h" template <class t> dvector<t>::dvector() { len=real_len =0; p=nullptr; } template<class t> dvector<t>::~dvector() { if(p!=nullptr) { delete []p; p=nullptr; } } template <class t> void dvector<t>::show() { if(p!=nullptr) { for(int i=0;i<real_len;i++){ std::cout<<i<<"\t"<<*(p+i)<<std::endl; } std::cout<<"length="<<real_len<<std::endl; }else { std::cout<<"nnnnnnnnnnnnnnnnnnnnnnnnnno thing"<<std::endl; } } template<class t> bool dvector<t>::push_back(t t){ if(p==nullptr) { //第一个为空说明只有一个元素 p=new t; *p=t; real_len=len=1; }else { //第一个不为空说明有多个元素,这时候链表就必须重新分配内存 //分配为数组形式 t *ptemp = new t[real_len+1]; for(int i=0;i<real_len;i++) { *(ptemp+i)=*(p+i); } *(ptemp+real_len)=t; delete []p; p=ptemp; real_len+=1; len+=1; } return true; } int main() { //测试基本类型 //string 会出错,因为string 不是基本类型,是一种类似 vector 的类模板,其内部的内存操作与基本类型不一样。 //1. int dvector<int>* dv1=new dvector<int>; dv1->push_back(12); dv1->push_back(15); dv1->push_back(1995); dv1->push_back(200); dv1->push_back(2); dv1->push_back(1); dv1->show(); //2. double dvector<double>* dv2=new dvector<double>; dv2->push_back(12.2); dv2->push_back(15.3); dv2->push_back(1995.0220); dv2->push_back(200.1); dv2->push_back(2.3); dv2->push_back(1.9); dv2->show(); //3. char* dvector<char*>* dv3=new dvector<char*>; dv3->push_back("nimei"); dv3->push_back("de"); dv3->push_back("垃圾"); dv3->push_back("95"); dv3->push_back("lalala"); dv3->push_back("45"); dv3->show(); return 0; }
晚上完善 增加了 删 改 查
- 和尹成老师视频里面写的不一样。。自己写的。反正就是不规范就是了
- dvector.h
#ifndef dvector_h #define dvector_h #pragma once #include <iostream> template <class t> class dvector { public: dvector(); ~dvector(); bool push_back(t); bool del(t); bool modify(t, t); int search(t t); void show(); public: t* p; int len; int real_len; }; #endif // dvector_h
- dvector.cpp
#include "dvector.h" using namespace std; template <class t> dvector<t>::dvector() { len=real_len =0; p=nullptr; } template<class t> dvector<t>::~dvector() { if(p!=nullptr) { delete []p; p=nullptr; } } //遍历输出 template <class t> void dvector<t>::show() { if(p!=nullptr) { for(int i=0;i<real_len;i++){ std::cout<<i<<"\t"<<*(p+i)<<std::endl; } std::cout<<"length="<<real_len<<std::endl; }else { std::cout<<"nnnnnnnnnnnnnnnnnnnnnnnnnno thing"<<std::endl; } } //增 template<class t> bool dvector<t>::push_back(t t){ if(p==nullptr) { //第一个为空说明只有一个元素 p=new t; *p=t; real_len=len=1; }else { //第一个不为空说明有多个元素,这时候链表就必须重新分配内存 //分配为数组形式 t *ptemp = new t[real_len+1]; for(int i=0;i<real_len;i++) { *(ptemp+i)=*(p+i); } *(ptemp+real_len)=t; delete []p; p=ptemp; real_len+=1; len+=1; } return true; } //查 返回查找到的序号 template <class t> int dvector<t>::search(t t) { if (p ==nullptr) { std::cout << "the dvector is empty ,abort!" << std::endl; return false; } else { for (size_t i = 0; i < real_len; i++) { if (*(p+i) == t) { cout << "find " << t << "at the position of " << i<<" " << endl; return i; } } cout << "no such a thing" << endl; return -1; } return -1; } //删 template <class t> bool dvector<t>::del(t t) { if (p == nullptr) { std::cout << "the dvector is alreafy empty ,abort!" << std::endl; return false; } else { for (size_t i = 0; i < real_len; i++) { if (*(p + i) == t) { cout << "deleting" << endl; cout << "find " << t << "at the position of " << i << " " << endl; //如果是在第一个的情况 if (i == 0) { for (size_t i = 0; i < real_len; i++) { if (real_len == 1) //如果是只剩一个而且刚好第一个是要删除的 { delete p; p == nullptr; real_len -= 1; return true; } else { //还有多个且第一个是要删除的 t* tmp = new t[real_len - 1]; for (size_t k = 0; k < real_len-1; k++) { *(tmp + k) = *(p + k + 1); } delete[]p; p = tmp; real_len -= 1; return true; } } } else if (i== real_len-1) //最后一个匹配要删除的时候 { p + i == nullptr; real_len -= 1; } else //在中间的情况 { t* tmp = new t[real_len - 1]; for (size_t k = 0; k < i ; k++) { *(tmp + k) = *(p + k); } // 利用两个循环刚好跳过下标为i 的值 k 为原来的p 中的值,tmp+k-i 为新数组中的下标 for (size_t k = i+1; k < real_len; k++) { *(tmp + k - 1) = *(p + k); } delete[]p; p = tmp; real_len -= 1; return true; } } } cout << "no such a thing,delete failed!" << endl; return false; } } //改 template <class t> bool dvector<t>::modify(t origin, t mo) { if (p == nullptr) { std::cout << "the dvector is empty ,abort!" << std::endl; return false; } else { for (size_t i = 0; i < real_len; i++) { if (*(p + i) == origin) { cout << "modifying" << endl; cout << "find " << origin << "at the position of " << i << " " << endl; *(p + i) = mo; } } cout << "no such a thing ,modify failed!" << endl; return false; } return -1; } int main() { //测试基本类型 //string 会出错,因为string 不是基本类型,是一种类似 vector 的类模板,其内部的内存操作与基本类型不一样。 //1. int dvector<int>* dv1=new dvector<int>; dv1->push_back(12); dv1->push_back(15); dv1->push_back(1995); dv1->push_back(200); dv1->push_back(2); dv1->push_back(1); dv1->show(); //dv1->search(200); //dv1->search(1000); dv1->del(12); dv1->show(); dv1->del(1995); dv1->show(); dv1->del(1); dv1->show(); dv1->modify(15, 33); dv1->modify(200, 1); dv1->modify(100, 1); dv1->show(); // cout<<"next............"<<endl<<endl; // //2. double // dvector<double>* dv2=new dvector<double>; // dv2->push_back(12.2); // dv2->push_back(15.3); // dv2->push_back(1995.0220); // dv2->push_back(200.1); // dv2->push_back(2.3); // dv2->push_back(1.9); // // dv2->show(); // // dv2->search(1.9); // // cout << "next............" << endl << endl; // // //3. char* // dvector<const char*>* dv3=new dvector<const char*>; // dv3->push_back("nimei"); // dv3->push_back("de"); // dv3->push_back("垃圾"); // dv3->push_back("95"); // dv3->push_back("lalala"); // dv3->push_back("45"); // //dv3->show(); //dv3->search("nimei"); //cout << "next............" << endl << endl; std::cin.get(); return 0; }
推荐阅读
-
Android 中启动自己另一个程序的activity如何实现
-
发一个自己用JS写的实用看图工具实现代码
-
UDP实现一个简易的聊天室(多个主机连接终端) 已完善
-
51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本
-
JAVA多线程的一个复习例子(取款同步)(希望大家不要看源代码,看题目自己写出实现)
-
自己实现一个简单的RPC框架
-
自己做的一个登陆注册留言板的界面未实现功能求指点 待更。。。。。。
-
c语言:实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
-
用面向对象的思想实现一个有理数以及有理数的加减乘除运算——Python版本
-
一个自己实现的Vector 完善版本