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

C++?vector的簡單實現(xiàn)

 更新時間:2022年03月08日 09:47:59   作者:吃米飯  
這篇文章主要為大家詳細介紹了C++?vector的簡單實現(xiàn),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

向量

向量是序列容器,表示可以更改大小的數(shù)組。

就像數(shù)組一樣,向量對其元素使用連續(xù)的存儲位置,這意味著也可以使用指向其元素的常規(guī)指針上的偏移量來訪問其元素,并且與數(shù)組一樣高效。但與數(shù)組不同的是,它們的大小可以動態(tài)變化,它們的存儲由容器自動處理。

在內(nèi)部,向量使用動態(tài)分配的數(shù)組來存儲其元素??赡苄枰匦路峙浯藬?shù)組,以便在插入新元素時增加大小,這意味著分配新數(shù)組并將所有元素移動到該數(shù)組。就處理時間而言,這是一項相對昂貴的任務(wù),因此,每次將元素添加到容器時,向量都不會重新分配。

相反,向量容器可以分配一些額外的存儲以適應(yīng)可能的增長,因此容器的實際容量可能大于嚴格需要的存儲來包含其元素(即其大?。炜梢詫崿F(xiàn)不同的增長策略,以平衡內(nèi)存使用和重新分配,但無論如何,重新分配應(yīng)僅以對數(shù)增長的大小間隔發(fā)生,以便可以在向量末尾插入單個元素,并提供攤銷的恒定時間復(fù)雜性。

因此,與數(shù)組相比,向量消耗更多的內(nèi)存,以換取管理存儲和以有效方式動態(tài)增長的能力。

與其他動態(tài)序列容器(deques、list 和 forward_lists)相比,向量非常有效地訪問其元素(就像數(shù)組一樣),并且相對有效地從其末尾添加或刪除元素。對于涉及在末尾以外的位置插入或刪除元素的操作,它們的性能比其他元素差,并且迭代器和引用的一致性低于 lists 和 forward_lists。

成員函數(shù)

	(構(gòu)造函數(shù))	構(gòu)造 vector(公開成員函數(shù))
	(析構(gòu)函數(shù))	析構(gòu) vector(公開成員函數(shù))
	operator=	賦值給容器(公開成員函數(shù))
	assign	將值賦給容器(公開成員函數(shù))
	get_allocator	返回相關(guān)的分配器(公開成員函數(shù))
	
元素訪問
	at	訪問指定的元素,同時進行越界檢查(公開成員函數(shù))
	operator[]	訪問指定的元素(公開成員函數(shù))
	front	訪問第一個元素(公開成員函數(shù))
	back	訪問最后一個元素(公開成員函數(shù))
	data	直接訪問底層數(shù)組(公開成員函數(shù))
	
迭代器
	begin,cbegin(C++11)	返回指向起始的迭代器(公開成員函數(shù))
	end,cend(C++11)	返回指向末尾的迭代器(公開成員函數(shù))
	rbegin,crbegin(C++11)	返回指向起始的逆向迭代器(公開成員函數(shù))
	rend,crend(C++11)	返回指向末尾的逆向迭代器(公開成員函數(shù))
	
容量
	empty	檢查容器是否為空(公開成員函數(shù))
	size	返回容納的元素數(shù)(公開成員函數(shù))
	max_size	返回可容納的最大元素數(shù)(公開成員函數(shù))
	reserve	預(yù)留存儲空間(公開成員函數(shù))
	capacity	返回當前存儲空間能夠容納的元素數(shù)(公開成員函數(shù))
	shrink_to_fit(C++11)	通過釋放未使用的內(nèi)存減少內(nèi)存的使用(公開成員函數(shù))
	
修改器
	clear	清除內(nèi)容(公開成員函數(shù))
	insert	插入元素(公開成員函數(shù))
	emplace(C++11)	原位構(gòu)造元素(公開成員函數(shù))
	erase	擦除元素(公開成員函數(shù))
	push_back	將元素添加到容器末尾(公開成員函數(shù))
	emplace_back(C++11)	在容器末尾就地構(gòu)造元素(公開成員函數(shù))
	pop_back	移除末元素(公開成員函數(shù))
	resize	改變?nèi)萜髦锌纱鎯υ氐膫€數(shù)(公開成員函數(shù))
	swap	交換內(nèi)容(公開成員函數(shù))
	
非成員函數(shù)
按照字典順序比較 vector 中的值(函數(shù)模板)
	operator==
	operator!=(C++20 中移除)
	operator<(C++20 中移除)
	operator<=(C++20 中移除)
	operator>(C++20 中移除)
	operator>=(C++20 中移除)
	operator<=>(C++20)
std::swap(std::vector)	特化 std::swap 算法(函數(shù)模板)
erase(std::vector),erase_if(std::vector)  (C++20)	擦除所有滿足特定判別標準的元素(函數(shù)模板

cpp

template <typename T>
class Vector
{
public:
    Vector() noexcept = default;
    explicit Vector(size_t n) : cap_{n}, ptr_{alloc(cap_)}
    {
        for (; len_ < n; ++len_)
        {
            construct(ptr_ + len_); //調(diào)用T的默認構(gòu)造
        }
    }
    Vector(size_t n, const T &x) : cap_{n}, ptr_{alloc(cap_)}
    {
        for (; len_ < n; ++len_)
        {
            construct(ptr_ + len_, x); //調(diào)用T的拷貝構(gòu)造
        }
    }
    Vector(const Vector &x) : cap_{x.size()}, ptr_{alloc(cap_)} //拷貝構(gòu)造
    {
        for (; len_ < x.size(); ++len_)
        {
            construct(ptr_ + len_, x[len_]);
        }
    }
    Vector(Vector &&x) noexcept //移動構(gòu)造
    {
        cap_ = std::__exchange(x.cap_, 0);
        len_ = std::__exchange(x.len_, 0);
        ptr_ = std::__exchange(x.ptr_, nullptr);
    }
    Vector(std::initializer_list<T> li) : cap_{li.size()}, ptr_{alloc(cap_)} //初始化列表
    {
        for (auto &x : li)
        {
            construct(ptr_ + len_, x);
            ++len_;
        }
    }

    ~Vector() noexcept
    {
        clear();
        dealloc(ptr_);
    }

    void swap(Vector &x) noexcept
    {
        using std::swap; // ADL
        swap(cap_, x.cap_);
        swap(len_, x.len_);
        swap(ptr_, x.ptr_);
    }
    void clear() noexcept
    {
        for (; len_ > 0; --len_)
        {
            destroy(ptr_ + len_ - 1);
        }
    }

    Vector &operator=(const T &x) //拷貝賦值
    {
        if (this != &x)
        {
            Vector{x}.swap(*this);
        }
        return *this;
    }
    Vector &operator=(T &&x) noexcept //移動賦值
    {
        if (this != &x)
        {
            Vector{std::move(x)}.swap(*this);
        }
        return *this;
    }
    Vector &operator=(std::initializer_list<T> li) //初始化列表賦值
    {
        Vector{li}.swap(*this);
        return *this;
    }

    void push_back(const T &x) //拷貝
    {
        emplace_back(x);
    }
    void push_back(T &&x) //移動
    {
        emplace_back(x);
    }
    template <typename... Args>
    void emplace_back(Args &&...args) //直接傳遞構(gòu)造函數(shù)
    {
        if (len_ == cap_)
        {
            size_t new_cap = cap_ ? cap_ * 2 : 1; //等0返回1
            T *new_ptr = alloc(new_cap);
            for (size_t new_len; new_len < len_; ++new_len)
            {
                construct(new_ptr + new_len, std::move_if_noexcept(ptr_[new_len]));
            }
            cap_ = new_cap;
            ptr_ = new_ptr;
        }
        construct(ptr_ + len_, std::forward<Args>(args)...);
        ++len_;
    }
    void pop_back() noexcept
    {
        if (len_ < cap_ / 2)
        {
            size_t new_cap = cap_ / 2;
            T *new_ptr = alloc(new_cap);
            for (size_t new_len = 0; new_len < len_; ++new_len)
            {
                construct(new_ptr + new_len, std::move_if_noexcept(ptr_[new_len]));
            }
            cap_ = new_cap;
            ptr_ = new_ptr;
        }
        destroy(ptr_ + len_ - 1);
        --len_;
    }
    size_t size() const noexcept
    {
        return len_;
    }
    size_t capacity() const noexcept
    {
        return cap_;
    }
    bool empty() const noexcept
    {
        return len_ == 0;
    }

    T &operator[](size_t i)
    {
        return ptr_[i];
    }
    const T &operator[](size_t i) const
    {
        return ptr_[i];
    }

    T *begin() noexcept
    {
        return ptr_;
    }
    T *end() noexcept
    {
        return ptr_ + len_;
    }
    const T *begin() const noexcept
    {
        return ptr_;
    }
    const T *end() const noexcept
    {
        return ptr_ + len_;
    }

private:
    T *alloc(size_t n) //分配n個大小內(nèi)存
    {
        return static_cast<T *>(::operator new(sizeof(T) * n));
    }
    void dealloc(T *p) noexcept //釋放內(nèi)存
    {
        ::operator delete(p);
    }
    template <typename... Args>
    void construct(T *p, Args &&...args) //在這塊內(nèi)存上構(gòu)造T類型對象
    {
        ::new (p) T(std::forward<Args>(args)...);
    }
    void destroy(T *p) noexcept
    {
        p->~T();
    }

private:
    size_t cap_{0}; //容量
    size_t len_{0}; //元素個數(shù)
    T *ptr_{nullptr};
};

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • C語言實現(xiàn)掃雷小游戲

    C語言實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語言 scanf的工作原理詳解

    C語言 scanf的工作原理詳解

    這篇文章主要為大家介紹了C語言 scanf的工作原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • c++標準庫讀寫ini文件的實現(xiàn)示例

    c++標準庫讀寫ini文件的實現(xiàn)示例

    本文介紹了一個完整的INI文件類的實現(xiàn),包含讀取和寫入操作,通過IniFile.h頭文件和IniFile.cpp實現(xiàn)文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • C語言實現(xiàn)簡單圖書管理系統(tǒng)

    C語言實現(xiàn)簡單圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • VS?Code?C++環(huán)境的搭建過程

    VS?Code?C++環(huán)境的搭建過程

    這篇文章主要介紹了VS?Code?C++環(huán)境的搭建,Somasegar 也告訴筆者這款編輯器也擁有對 Git 的開箱即用的支持,需要的朋友可以參考下
    2022-04-04
  • C語言推箱子游戲?qū)崿F(xiàn)代碼

    C語言推箱子游戲?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細介紹了C語言推箱子游戲?qū)崿F(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • C語言中的運算符和結(jié)合性問題

    C語言中的運算符和結(jié)合性問題

    這篇文章主要介紹了C語言中的運算符和結(jié)合性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C語言內(nèi)存管理及初始化細節(jié)示例詳解

    C語言內(nèi)存管理及初始化細節(jié)示例詳解

    這篇文章主要為大家介紹了C語言內(nèi)存管理及初始化細節(jié)示例的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 判斷兩顆二叉樹是否相似的兩種方法

    判斷兩顆二叉樹是否相似的兩種方法

    今天小編就為大家分享一篇關(guān)于判斷兩顆二叉樹是否相似的兩種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • C++ 中回調(diào)函數(shù)詳解及簡單實例

    C++ 中回調(diào)函數(shù)詳解及簡單實例

    這篇文章主要介紹了C++ 中回調(diào)函數(shù)詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

井陉县| 泗洪县| 黄骅市| 玉环县| 车致| 晋中市| 敦化市| 崇信县| 格尔木市| 刚察县| 虎林市| 观塘区| 新源县| 确山县| 上高县| 栖霞市| 车险| 元阳县| 个旧市| 搜索| 青铜峡市| 河源市| 岳西县| 蒙阴县| 南溪县| 鄂尔多斯市| 县级市| 屯昌县| 洪雅县| 新和县| 竹山县| 雷山县| 镇康县| 准格尔旗| 蓬安县| 阜宁县| 崇礼县| 北京市| 长葛市| 保靖县| 丰镇市|