文章目錄
- 🚀1.1 vector介紹
- 🚀1.2 vector的初始化
- 🚀1.3 vector的常用內置函數
- 🚀1.4 vector的遍歷
🚀1.1 vector介紹
- vector是表示可變大小數組的序列容器。
- 就像數組一樣,vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大小是可以動態改變的,而且它的大小會被容器自動處理。
- 本質講,vector使用動態分配數組來存儲它的元素。當新元素插入時候,這個數組需要被重新分配大小為了增加存儲空間。其做法是,分配一個新的數組,然后將全部元素移到這個數組。就時間而言,這是一個相對代價高的任務,所以每當一個新的元素加入到容器的時候,vector并不會每次都重新分配大小。
- vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為存儲空間比實際需要的存儲空間更大。不同的庫采用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是對數增長的間隔大小,以至于在末尾插入一個元素的時候是在常數時間的復雜度完成的。
- 因此,vector占用了更多的存儲空間,為了獲得管理存儲空間的能力,并且以一種有效的方式動態增長。
- 與其它動態序列容器相比(deque, list and forward_list), vector在訪問元素的時候更加高效,在末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入操作,效率更低。比起list和forward_list統一的迭代器和引用更好
🚀1.2 vector的初始化
vector的庫中包含多種初始化方式:
注意
: < >內為vector所儲存的數據類型
??方式1:
//建立一個空vector,儲存int類型
vector<int>ans;
??方式2:
//建立一個儲存10個int類型,每個元素初始化為0的vector
vector<int>ans(10);
??方式3:
vector<int>ans(10,1);
//拷貝一個vector來初始化
vector<int>ans1(ans);
??方式4:
//通過迭代器,截取一段數組的一部分來初始化
vector<int> ans = {1,2,3,4,5,6,7,8};
string s("HHello Worldd");//ans1 = {2,3,4,5,6,7} ans2={“Hello World”}
vector<char>ans1(ans.begin()+1, ans.end()-1);
vector<char>ans2(s.begin() + 1, s.end() - 1);
??方式5:
vector<int>ans(10,1);
//拷貝一個vector
vector<int>ans1(ans); 或者 vector<int>ans1 = ans;
??方式6:
//從一個數組初始化
int a[] = {1,2,3,4,5};
vector<int>ans(a, a + 5); 或者 vector<int>ans ={1,2,3,4,5};
??方式7:初始化二維數組
//初始化10行10列的二維數組,每個元素初始化為0,類型為int
vector<vector<int>>ans(10, vector<int>(10));
🚀1.3 vector的常用內置函數
??push_back:尾插
vector<int>ans= {1,2,3};
ans.push_back(1);//尾插數據1
??pop_back:尾刪
vector<int>ans= {1,2,3};
ans.pop_back();//刪除最后一個數據3
??begin:指向第一個數據的迭代器
vector<int>ans= {1,2,3};
cout<< *(ans.begin()); // 輸出1
??end:指向最后一個數據的下一位的迭代器
vector<int>ans= {1,2,3};
cout<< *(ans.end()-1); // 輸出3
??insert:插入一個數據,第一個參數是位置(類型為迭代器),第二個位置為數據 時間復雜度O(n)
ans.insert(ans.begin() + pos, val);//在下標pos位置插入val
??erase():有兩種用法:第一種刪除單個下標的數據,第二種刪除范圍下標的數據。 時間復雜度O(n)
若只傳入第一個參數(類型為迭代器),只會刪除那個下標的元素,若再傳入第二個參數(類型為迭代器),刪除從第一個迭代器開始,到第二個迭代器前一個的所有元素
vector<int>ans= {1,2,3,4,5,6};
ans.erase(ans.begin() + pos);//刪除pos下標的元素ans.erase(ans.begin() + pos1,ans.begin() + pos2);
//刪除pos1下標 到 pos2下標(不包括pos2)的所有元素ans.erase(ans.begin(), ans.end());
//刪除所有元素
??clear :清除所有元素
vector<int>ans= {1,2,3,4,5,6};
ans.clear();
??size :返回元素個數
vector<int>ans= {1,2,3,4,5,6};
cout<<ans.size(); // 輸出6
??swap :數組交換
vector<int>ans1= {1,2,3,4,5,6};
vector<int>ans2;
ans1.swap(ans2);
🚀1.4 vector的遍歷
??方式1:數組遍歷
vector<int>ans1= {1,2,3,4,5,6};
for (int i = 0; i < ans.size(); i++)
{cout << ans[i];
}
??方式2:迭代器遍歷
vector<int>ans1= {1,2,3,4,5,6};
for (auto it = ans.begin(); it != ans.end();it++)
{cout << *it;
}
??方式3:范圍for遍歷
vector<int>ans1= {1,2,3,4,5,6};
for (auto it: ans1)
{cout << *it;
}
本文就到這里,感謝你看到這里!
我知道一些人看文章喜歡靜靜看,不評論,但是他會點贊,這樣的人,帥氣低調有內涵,美麗大方很優雅,明人不說暗話,要你手上的一個點贊!