最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++ vector模擬實(shí)現(xiàn)的全過程

 更新時(shí)間:2021年04月12日 11:48:21   作者:趕路人丶  
這篇文章主要給大家介紹了關(guān)于c++ vector的模擬實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、vector是什么?

vector是表示可變大小數(shù)組的序列容器,它也采用連續(xù)存儲(chǔ)空間來存儲(chǔ)元素,因此可以采用下標(biāo)對(duì)vector的元素進(jìn)行訪問,它的大小是動(dòng)態(tài)改變的,vector使用動(dòng)態(tài)分配數(shù)組來存儲(chǔ)它的元素;

二、容器特性

1.順序序列

順序容器中的元素按照嚴(yán)格的線性順序排序??梢酝ㄟ^元素在序列中的位置訪問對(duì)應(yīng)的元素;

2.動(dòng)態(tài)數(shù)組

支持對(duì)序列中的任意元素進(jìn)行快速直接訪問,甚至可以通過指針進(jìn)行該操作。操供了在序列末尾相對(duì)快速地添加/刪除元素的操作;

3.能夠感知內(nèi)存分配器的

容器使用一個(gè)內(nèi)存分配器對(duì)象來動(dòng)態(tài)地處理它的存儲(chǔ)需求;

三、vector的模擬實(shí)現(xiàn)

定義一個(gè)類:

template<class T>
class Vector
{
    T* _start; //首元素地址
    T* _finish; //最后一個(gè)元素地址的下一個(gè)地址
    T* _endOfStorage; //空間的尾地址
public:
//成員函數(shù)
};

構(gòu)造函數(shù)

Vector()
    :_start(nullptr)
    , _finish(nullptr)
    , _endOfStorage(nullptr)
{}

Vector(size_t n, const T& value = T())
    :_start(nullptr)
    , _finish(nullptr)
    , _endOfStorage(nullptr)
{
    reserve(n);
    while (n--)
    {
        push_back(value);
    }
}
Vector(InputInterator first, InputInterator last)
        :_start(nullptr)
        , _finish(nullptr)
        , _endOfStorage(nullptr)
    {
        while (first != last)
        {
            pushBack(*first);
            ++first;
        }
    }

數(shù)據(jù)大小、空間大小

size_t size() const
{
    return _finish - _start;
}

size_t capacity() const
{
    return _endOfStorage - _start;
}

尾插

void pushBack(const T& value)
    {
        if (_finish == _endOfStorage)
        {
            size_t newC = _endOfStorage == nullptr ? 1 : 2 * capacity();
            reverse(value);
        }
        *_finish = value;   
        ++_finish;
    }

擴(kuò)容

有資源進(jìn)行拷貝時(shí),使用深拷貝;類型為自定義類型時(shí),發(fā)生淺拷貝,調(diào)用自定義類型析構(gòu)函數(shù),釋放資源,導(dǎo)致資源二次釋放,所以自定義類型的拷貝有資源時(shí)進(jìn)行深拷貝;

深拷貝與淺拷貝的區(qū)別及應(yīng)用

void reserve(size_t n)
{
if (n &gt; capacity())
{
size_t sz = size();
T* arr = new T[n];
if (_start)
{
memcpy(arr, _start, sizeof(T) * sz);
delete[] _start;
}
//update
_start = arr;
_finish = _start + sz;
_endOfStorage = _start + n;
}
}

改變數(shù)據(jù)大小

void resize(size_t n, const T& val = T())
    {
        if (n > capacity())
        {
            reserve(n);
        }
        else if (n > size())
        {
            while (_finish != _start + n)
            {
                *_finish = val;
                _finish++;
            }
        }
            _finish = _start + n;
    }

位置插入值

void insert(iterator pos, const T& val)
    {
        size_t sz = pos - _start;
        //檢查位置
        if (pos >= _start && pos <= _finish)
        {
            //檢查容量
            if (_finish == _endOfStoage)
            {
                size_t n = _endOfStorage == nullptr ? 1 : 2 * capacity();               
                reserve(n);
                //更新迭代器
                pos = _start + sz;
            }
            //移動(dòng)元素
            iterator end_u = _finish;
            while (end_u != pos)
            {
                *end = *(end_u - 1);
                --end_u();
            }
            //插入元素
            *pos = val;
            //更新位置
            ++_finish;
        }
    }

刪除數(shù)據(jù)

iterator erase(iterator pos)
    {
        //檢查位置
        if (pos < _finish && pos >= _start)
        {
            //移動(dòng)元素
            iterator start = pos + 1;
            while (start!=_finish)
            {
                *(start - 1) = *start;
                start++;
            }
            //更新
            --_finish;
        }
        return pos;
    }
    //返回刪除數(shù)據(jù)的下一個(gè)元素的位置

operator[] 重載

T& operator[](size_t pos)
    {
        if (pos >= 0 && pos < size())
            return _start[pos];
    }

operator= 重載

    Vector<T>& operator=(const Vector<T>& v)
    {
        if (this != &v)
        {
            delete[]_start;
            size_t n = v.capacity();
            _start = new T[n];
            for (size_t i = 0; i < v.capacity(); ++i)
            {
                _start[i] = v._start[i];
            }
            _finish = _start + v.size();
            _finish = _start + n;
        }
        return *this;
    }

迭代器

//vector迭代器:T*
typedef T* iterator;
typedef const T* const_iterator;

iterator begin()
{
    return _start;
}

iterator end()
{
    return _finish;
}

const_iterator begin() const
{
    return _start;
}

const_iterator end() const
{
    return _finish;
}

析構(gòu)函數(shù)

~Vector()
{
    if (_start)
    {
        delete[] _start;
        _start = _finish = _endOfStorage = nullptr;
    }
}

總結(jié)

到此這篇關(guān)于c++ vector模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c++ vector模擬實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++合并兩個(gè)升序鏈表的方式

    C/C++合并兩個(gè)升序鏈表的方式

    這篇文章主要介紹了C/C++合并兩個(gè)升序鏈表的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++中繼承(inheritance)詳解及其作用介紹

    C++中繼承(inheritance)詳解及其作用介紹

    這篇文章主要介紹了C++中繼承(inheritance)詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C++?常量成員函數(shù)學(xué)習(xí)筆記

    C++?常量成員函數(shù)學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++?常量成員函數(shù)學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案

    Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • C++ string格式化輸出方式

    C++ string格式化輸出方式

    今天小編就為大家分享一篇C++ string格式化輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • QT線程池的使用(QThreadPool類和QRunnable類)

    QT線程池的使用(QThreadPool類和QRunnable類)

    本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語言基礎(chǔ)知識(shí)點(diǎn)指針的使用

    C語言基礎(chǔ)知識(shí)點(diǎn)指針的使用

    這篇文章主要介紹了C語言基礎(chǔ)知識(shí)點(diǎn)指針的使用,下面文章將讓我們掌握指針的概念和用法、指針與數(shù)組之間的關(guān)系、指針指向的指針、如何使用指針變量做函數(shù)參數(shù)等更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • C語言詳細(xì)解析有符號(hào)數(shù)與無符號(hào)數(shù)的表示

    C語言詳細(xì)解析有符號(hào)數(shù)與無符號(hào)數(shù)的表示

    我們知道,在C語言中存在無符號(hào)數(shù)和有符號(hào)數(shù),但是對(duì)于計(jì)算機(jī)而言,其本身并不區(qū)別有符號(hào)數(shù)和無符號(hào)數(shù),因?yàn)樵谟?jì)算機(jī)里面都是O或者1,但是在我們的實(shí)際使用中有時(shí)候需要使用有符號(hào)數(shù)來表示一個(gè)整數(shù),因此我們規(guī)定,當(dāng)最高位為1的時(shí),表示為負(fù)數(shù),最高位為0時(shí),表示為正數(shù)
    2022-04-04
  • C語言實(shí)現(xiàn)求解最小公倍數(shù)的算法示例

    C語言實(shí)現(xiàn)求解最小公倍數(shù)的算法示例

    這篇文章主要為大家介紹了C語言如何實(shí)現(xiàn)求解任意兩個(gè)正整數(shù)的最小公倍數(shù),文中采用了窮舉法和定理法。感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C#中委托的基本用法總結(jié)

    C#中委托的基本用法總結(jié)

    以下是對(duì)C#中委托的基本用法進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友可以過來參考下。希望對(duì)大家有所幫助
    2013-09-09

最新評(píng)論

青神县| 连山| 富民县| 韩城市| 突泉县| 宁远县| 荣昌县| 隆林| 新源县| 通辽市| 汾阳市| 香港 | 左权县| 土默特左旗| 西林县| 汨罗市| 定日县| 略阳县| 淮阳县| 迁安市| 阿图什市| 黎城县| 白沙| 平顶山市| 济源市| 普洱| 开阳县| 贵溪市| 德令哈市| 汉阴县| 雅安市| 扶沟县| 新闻| 武宁县| 龙陵县| 慈溪市| 米易县| 合肥市| 定边县| 噶尔县| 浪卡子县|