向量是序列容器,表示可以更改大小的陣列。
就像陣列一樣,向量對其元素使用連續的儲存位置,這意味著也可以使用指向其元素的常規指標上的偏移量來訪問其元素,並且與陣列一樣高效。但與陣列不同的是,它們的大小可以動態變化,它們的儲存由容器自動處理。
在內部,向量使用動態分配的陣列來儲存其元素。可能需要重新分配此陣列,以便在插入新元素時增加大小,這意味著分配新陣列並將所有元素移動到該陣列。就處理時間而言,這是一項相對昂貴的任務,因此,每次將元素新增到容器時,向量都不會重新分配。
相反,向量容器可以分配一些額外的儲存以適應可能的增長,因此容器的實際容量可能大於嚴格需要的儲存來包含其元素(即其大小)。庫可以實現不同的增長策略,以平衡記憶體使用和重新分配,但無論如何,重新分配應僅以對數增長的大小間隔發生,以便可以在向量末尾插入單個元素,並提供攤銷的恆定時間複雜性。
因此,與陣列相比,向量消耗更多的記憶體,以換取管理儲存和以有效方式動態增長的能力。
與其他動態序列容器(deques、list 和 forward_lists)相比,向量非常有效地訪問其元素(就像陣列一樣),並且相對有效地從其末尾新增或刪除元素。對於涉及在末尾以外的位置插入或刪除元素的操作,它們的效能比其他元素差,並且迭代器和引用的一致性低於 lists 和 forward_lists。
template class vector
, ptr_
}vector(size_t n, const t &x) : cap_, ptr_
}vector(const vector &x) : cap_, ptr_ //拷貝構造
}vector(vector &&x) noexcept //移動構造
vector(std::initializer_listli) : cap_, ptr_ //初始化列表
}~vector() noexcept
void swap(vector &x) noexcept
void clear() noexcept
}vector &operator=(const t &x) //拷貝賦值
.swap(*this);
}return *this;
}vector &operator=(t &&x) noexcept //移動賦值
.swap(*this);
}return *this;
}vector &operator=(std::initializer_listli) //初始化列表賦值
.swap(*this);
return *this;
}void push_back(const t &x) //拷貝
void push_back(t &&x) //移動
template void emplace_back(args &&...args) //直接傳遞建構函式
cap_ = new_cap;
ptr_ = new_ptr;
}construct(ptr_ + len_, std::forward(args)...);
++len_;
}void pop_back() noexcept
cap_ = new_cap;
ptr_ = new_ptr;
}destroy(ptr_ + len_ - 1);
--len_;
}size_t size() const noexcept
size_t capacity() const noexcept
bool empty() const noexcept
t &operator(size_t i)
const t &operator(size_t i) const
t *begin() noexcept
t *end() noexcept
const t *begin() const noexcept
const t *end() const noexcept
private:
t *alloc(size_t n) //分配n個大小記憶體
void dealloc(t *p) noexcept //釋放記憶體
template void construct(t *p, args &&...args) //在這塊記憶體上構造t型別物件
void destroy(t *p) noexcept
private:
size_t cap_; //容量
size_t len_; //元素個數
t *ptr_;
};
Vector的簡單實現
曾經在論壇上看到面試時候被問到stl中vector的實現,想想如果真的要實現vector的原始碼,僅僅是乙個allocator就非常麻煩,一二時分鐘內是搞不定的,面試官出這道題也就是想知道你對stl的實現理解程度。template class vector vector const vector r...
STL容器 vector的使用 C 簡單實現
上次我們聊到了順序容器與關聯容器的概念,也簡要總結了stl中主要容器的分類,同時也對list具體的使用與實現進行了描述,這次我們關注vector vector字面意思很好理解,向量 這樣我們可以直接得知它屬於一種順序容器,那麼意味著他在記憶體上的分布是連續的,那麼我們順理成章的可以想到其內部是用陣列...
STL 簡單 vector 的實現
stl 簡單 vector 的實現 我用vs2013寫的程式 github vector版本的 位於 我是照著侯捷老師的 stl原始碼剖析 做的cghstl,現在才看到第三章,覺得這本書的編排非常適合自學。第一章講解空間配置器,這是stl最基礎的部件,沒什麼好說的。第二章講解迭代器,老師舉了單向鍊錶...