一個自己實現的Vector 完善版本

来源:https://www.cnblogs.com/dev995/archive/2020/01/03/12142948.html
-Advertisement-
Play Games

一個自己實現的Vector(只能處理基本類型數據) 轉載自: https://www.ev0l.art/index.php/archives/22/ string 類型不行 bool char int double float long long 等基本類型可用 使用模板類實現。底層為數組實現。 d ...


一個自己實現的Vector(只能處理基本類型數據)

轉載自: https://www.ev0l.art/index.php/archives/22/

  • 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;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2)局部變數和全局變數 馬克-to-win:瀏覽器裡面 window 就是 global,通常可以省。nodejs 里沒有 window,但是有個叫 global 的。例 3.2.1<html><head> <meta http-equiv="content-type" content="text/ ...
  • What do we need? 筆者目的是在vue項目打包後的 dist/index.html 文件中寫入本次打包git用戶、最後一次git提交信息,這樣做的目的是便於線上項目的管理和防止同事之間的相互扯皮。最後打包出的效果如下圖: How to do? 版本信息需要記錄 git最後一次提交作者( ...
  • javascript當中null和undefined的==和===的比較 ...
  • 本系統包括兩台Web伺服器和個資料庫伺服器,資料庫伺服器採用雙主從配置,另外還有負載均衡以及redis實現session共用 ...
  • ORM一直是長久不衰的話題,各種重覆造輪子的過程一直在進行,輪子都一樣是圓的,你的又有什麼特點呢? CRL這個輪子造了好多年,功能也越來越標準完備,在開發過程中,解決了很多問題,先上一張腦圖描述CRL的功能 開發框架的意義在於 開發更標準,更統一,不會因為不同人寫的代碼不一樣 開發效率更高,無需重新 ...
  • 年前我們一起聊了 程式員為什麼要懂架構、架構是什麼 和 架構都有哪些類型 這三個話題,今天我們來看看架構師是怎樣開展工作的,他/她需要對接上下游哪些角色,以什麼作為工作輸入,最終要對外輸出什麼產物。這些內容既有助於我們跟架構崗同事更好的協作,也可以作為是否往架構轉型的參考,接下來我們一起揭開架構師的... ...
  • 老讀者都知道了,六年前,我從蘇州回到洛陽,抱著一幅“海歸”的心態,投了不少簡歷,也“約談”了不少面試官,但僅有兩三個令我感到滿意。其中有一位叫老馬,至今還活在我的手機通訊錄里。他當時扔了一個面試題把我砸懵了:“王二,Java 字元串可以引用傳遞嗎?” 我當時二十三歲,正值青春年華,從事 Java 編 ...
  • 如果對於Post提交,需要對參數進行urlEncode處理的需要註意。 對於Post參數,可以用TString或者TStringStream兩者。如果你採用的是用TStringStream,那麼必須按照要求,自行urlEncode處理。這裡沒有問題。 但如果你是用的TString參數。那麼請不要做u ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...