<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
向量是序列容器,表示可以更改大小的陣列。
就像陣列一樣,向量對其元素使用連續的儲存位置,這意味著也可以使用指向其元素的常規指標上的偏移量來存取其元素,並且與陣列一樣高效。但與陣列不同的是,它們的大小可以動態變化,它們的儲存由容器自動處理。
在內部,向量使用動態分配的陣列來儲存其元素。可能需要重新分配此陣列,以便在插入新元素時增加大小,這意味著分配新陣列並將所有元素移動到該陣列。就處理時間而言,這是一項相對昂貴的任務,因此,每次將元素新增到容器時,向量都不會重新分配。
相反,向量容器可以分配一些額外的儲存以適應可能的增長,因此容器的實際容量可能大於嚴格需要的儲存來包含其元素(即其大小)。庫可以實現不同的增長策略,以平衡記憶體使用和重新分配,但無論如何,重新分配應僅以對數增長的大小間隔發生,以便可以在向量末尾插入單個元素,並提供攤銷的恆定時間複雜性。
因此,與陣列相比,向量消耗更多的記憶體,以換取管理儲存和以有效方式動態增長的能力。
與其他動態序列容器(deques、list 和 forward_lists)相比,向量非常有效地存取其元素(就像陣列一樣),並且相對有效地從其末尾新增或刪除元素。對於涉及在末尾以外的位置插入或刪除元素的操作,它們的效能比其他元素差,並且迭代器和參照的一致性低於 lists 和 forward_lists。
(建構函式) 構造 vector(公開成員函數) (解構函式) 解構 vector(公開成員函數) operator= 賦值給容器(公開成員函數) assign 將值賦給容器(公開成員函數) get_allocator 返回相關的分配器(公開成員函數) 元素存取 at 存取指定的元素,同時進行越界檢查(公開成員函數) operator[] 存取指定的元素(公開成員函數) front 存取第一個元素(公開成員函數) back 存取最後一個元素(公開成員函數) data 直接存取底層陣列(公開成員函數) 迭代器 begin,cbegin(C++11) 返回指向起始的迭代器(公開成員函數) end,cend(C++11) 返回指向末尾的迭代器(公開成員函數) rbegin,crbegin(C++11) 返回指向起始的逆向迭代器(公開成員函數) rend,crend(C++11) 返回指向末尾的逆向迭代器(公開成員函數) 容量 empty 檢查容器是否為空(公開成員函數) size 返回容納的元素數(公開成員函數) max_size 返回可容納的最大元素數(公開成員函數) reserve 預留儲存空間(公開成員函數) capacity 返回當前儲存空間能夠容納的元素數(公開成員函數) shrink_to_fit(C++11) 通過釋放未使用的記憶體減少記憶體的使用(公開成員函數) 修改器 clear 清除內容(公開成員函數) insert 插入元素(公開成員函數) emplace(C++11) 原位構造元素(公開成員函數) erase 擦除元素(公開成員函數) push_back 將元素新增到容器末尾(公開成員函數) emplace_back(C++11) 在容器末尾就地構造元素(公開成員函數) pop_back 移除末元素(公開成員函數) resize 改變容器中可儲存元素的個數(公開成員函數) swap 交換內容(公開成員函數) 非成員函數 按照字典順序比較 vector 中的值(函數模板) 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 演演算法(函數模板) erase(std::vector),erase_if(std::vector) (C++20) 擦除所有滿足特定判別標準的元素(函數模板
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_); //呼叫T的預設構造 } } Vector(size_t n, const T &x) : cap_{n}, ptr_{alloc(cap_)} { for (; len_ < n; ++len_) { construct(ptr_ + len_, x); //呼叫T的拷貝構造 } } Vector(const Vector &x) : cap_{x.size()}, ptr_{alloc(cap_)} //拷貝構造 { for (; len_ < x.size(); ++len_) { construct(ptr_ + len_, x[len_]); } } Vector(Vector &&x) noexcept //移動構造 { 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) //直接傳遞建構函式 { 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個大小記憶體 { return static_cast<T *>(::operator new(sizeof(T) * n)); } void dealloc(T *p) noexcept //釋放記憶體 { ::operator delete(p); } template <typename... Args> void construct(T *p, Args &&...args) //在這塊記憶體上構造T型別物件 { ::new (p) T(std::forward<Args>(args)...); } void destroy(T *p) noexcept { p->~T(); } private: size_t cap_{0}; //容量 size_t len_{0}; //元素個數 T *ptr_{nullptr}; };
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45