簡介:
vectro的資料安排以及操作方式,與array陣列非常相似。
array是靜態空間,一旦配置了就不能改變;
vector是
動態空間
,隨著元素的加入,它的內部機制
會自行擴充空間以容納新元素
。
vector維護的是一個
連續性空間
,所以vector支援隨機存取,可以像陣列一樣使用“[]”。
vector的資料結構:
vector使用的迭代器
vector示意圖
vector的erase:
vector的erase操作效果
vector的插入操作:
備用空間充足
備用空間充足
備用空間不足
注意:插入資料動態擴容的大小不一定是放大一倍,放大的數為:max(old_size,n)
透過下面的示例可以看出vector在插入資料時capacity的變化規律(IDE:visual studio 2022):
vector的擴容操作:
vector的擴容方式有兩種,下面詳細分析一下他們的差異。
①
vector的resize
:
既分配了空間,也建立了物件,會呼叫建構函式。
void
resize
(size_type new_size, const T& x) {
if (new_size < size())
erase
(begin() + new_size, end());
else
insert
(end(), new_size - size(), x);
}
void
resize
(size_type new_size) { resize(new_size, T()); }
由此可以看出:
resize()既修改capacity大小,也修改size大小。
②
vector的reserve:
reserve()表示
容器預留空間,但不是真正的建立物件
,需要透過insert()或push_back()等操作建立物件。
template
iterator
allocate_and_copy
(size_type n,
ForwardIterator first, ForwardIterator last) {
iterator result =
data_allocator::allocate
(n);
//建立n個元素的新空間
__STL_TRY {
uninitialized_copy
(first, last, result);
//把vector舊空間中的所有有效資料(
las-first條資料
),順序複製到vector的新空間裡,
return result;
}
__STL_UNWIND(
data_allocator::deallocate
(result, n));
}
void
reserve
(size_type n) {
if (capacity() < n) {
const size_type old_size = size();
iterator tmp =
allocate_and_copy
(n, start, finish);
destroy
(start, finish);
//析構vector舊空間中的所有有效資料(las-first條資料)
deallocate
();
//釋放vector舊空間
start = tmp;
finish = tmp + old_size;
//vector的實際元素個數還是和以前一樣,沒有變化
end_of_storage = start + n;
//vector總容積大小增加了n個元素
}
}
由此可以看出:
reserve()只修改capacity大小,不修改size大小。
透過下面的示例可以看出vector在resize和reserve處理下的差異(IDE:visual studio 2022):
因此,在只需要足夠的空間而不需要生成物件時(通常是為了節約插入元素的時間),應該選擇reserve方法進行擴容。
示例程式碼:
#include
#include
using namespace std;
void fun_vector_test()
{
//構造資料
vector
cout << “ vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
cout << “插入資料:” << endl;
ver_obj。push_back(5); cout << “push_back(5) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(10); cout << “push_back(10) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(15); cout << “push_back(15) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(20); cout << “push_back(20) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(25); cout << “push_back(25) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(30); cout << “push_back(30) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(35); cout << “push_back(35) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(40); cout << “push_back(40) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(45); cout << “push_back(45) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(50); cout << “push_back(50) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(55); cout << “push_back(55) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(60); cout << “push_back(60) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(65); cout << “push_back(65) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(70); cout << “push_back(70) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(75); cout << “push_back(75) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(80); cout << “push_back(80) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(85); cout << “push_back(85) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(90); cout << “push_back(90) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(95); cout << “push_back(95) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(100); cout << “push_back(100) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(101); cout << “push_back(101) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(102); cout << “push_back(102) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(103); cout << “push_back(103) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(104); cout << “push_back(104) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(105); cout << “push_back(105) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(106); cout << “push_back(106) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(107); cout << “push_back(107) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(108); cout << “push_back(108) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(109); cout << “push_back(109) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
ver_obj。push_back(200); cout << “push_back(200) vector 實際元素個數:” << ver_obj。size() << “ vector bucket的總數capacity:” << ver_obj。capacity() << endl;
cout <<“列印資訊:” << endl;
auto iter_print = ver_obj。begin();
for (; iter_print != ver_obj。end(); ++iter_print)
{
cout <<“ ”<< * iter_print;
}
cout << endl;
ver_obj。reserve(10); cout << “ vector 調整reserve為10 capacity:” << ver_obj。capacity() << “ vector 實際元素個數:” << ver_obj。size() << endl;
iter_print = ver_obj。begin();
for (; iter_print != ver_obj。end(); ++iter_print)
{
cout << “ ” << *iter_print;
}
cout << endl;
try
{
ver_obj。resize(10); cout << “ vector 調整resize為10 capacity:” << ver_obj。capacity() << “ vector 實際元素個數:” << ver_obj。size() << endl;
}
catch (const std::exception& e)
{
cout << “ vector 調整resize為10 exception:” << e。what() << endl;
}
iter_print = ver_obj。begin();
for (; iter_print != ver_obj。end(); ++iter_print)
{
cout << “ ” << *iter_print;
}
cout << endl;
ver_obj。resize(80); cout << “ vector 調整resize為80 capacity:” << ver_obj。capacity() << “ vector 實際元素個數:” << ver_obj。size() << endl;
iter_print = ver_obj。begin();
for (; iter_print != ver_obj。end(); ++iter_print)
{
cout << “ ” << *iter_print;
}
cout << endl;
ver_obj。reserve(100); cout << “ vector 調整reserve為100 capacity:” << ver_obj。capacity() << “ vector 實際元素個數:” << ver_obj。size() << endl;
iter_print = ver_obj。begin();
for (; iter_print != ver_obj。end(); ++iter_print)
{
cout << “ ” << *iter_print;
}
cout << endl;
ver_obj。resize(100); cout << “ vector 調整resize為100 capacity:” << ver_obj。capacity() << “ vector 實際元素個數:” << ver_obj。size() << endl;
iter_print = ver_obj。begin();
for (; iter_print != ver_obj。end(); ++iter_print)
{
cout << “ ” << *iter_print;
}
cout << endl;
ver_obj。reserve(150); cout << “ vector 調整reserve為150 capacity:” << ver_obj。capacity() << “ vector 實際元素個數:” << ver_obj。size() << endl;
iter_print = ver_obj。begin();
for (; iter_print != ver_obj。end(); ++iter_print)
{
cout << “ ” << *iter_print;
}
cout << endl;
}
int main()
{
fun_vector_test();
return 0;
}
原創不易,歡迎點贊、收藏、關注!
- 上一篇:真實理想的創作
猜你喜歡
- 2022-12-20三月流焱:接受自己的不完美,就是完美的開始
- 2021-12-08著色器語言GLSL基礎
- 2021-06-01《尼爾 人工生命 ver.1.22474487139……》新舊對比 畫面升級明顯
- 2021-05-11《怪物獵人崛起》四月底更新!雄火龍 霞龍等上線
- 2021-05-0623年經典動漫遊戲《徽章戰士》復活 全新腕錶型互動玩具登場