網站首頁 編程語言 正文
vector翻譯為向量,但是這里使用“變長數組”的叫法更容易理解,也即“長度根據需要而自動改變的數組”。在考試題中,有時會碰到只用普通數組會超內存的情況,這種情況使用vector會讓問題的解決便捷許多。另外, vector還可以用來以鄰接表的方式儲存圖,這對無法使用鄰接矩陣的題目(結點數太多)、又害怕使用指針實現鄰接表的讀者是非常友好的寫法也非常簡潔。
需要的頭文件:
#include <vector>
需要的其他東西:
using namespace std;
vector的定義
vector的定義的格式:
vector<typename> name;
上面這個定義其實相當于是一維數組name[ SIZE ],只不過其長度可以根據需要進行變化,
比較節省空間,說通俗了就是"邊長數組"。
和一維數組一樣,這里的typename 可以是任何基本類型,例如: int 、double 、char、結構體等,也可以是STL標準容器,
例如 vector 、set、queue等。需要注意的是,如果typename也是一個STL容器,定義的時候要記得在 >> 符號之間加上空格,
因為一些使用C++ 11之前標準的編譯器會把它視為移位操作,導致編譯錯誤。
例子:
#include<cstdio>
#include<vector>
using namespace std;
struct student
{
int age;
char name[20];
};
int main(void)
{
vector<int> a;
vector<double> b;
vector<char> c;
vector<student> d;
return 0;
}
如果typename 是vector,就是下面這樣定義:
vector< vector<int> > name;// >>之間要加空格
可以很容易聯想到二維數組的定義,即其中一維是一個數組的數組。那么二維vector數組也是一樣的,
即Arrayname[]中的每一個元素都是vector。
初學者可以把二維vector 數組當作兩個維都可變長的二維數組理解。
定義vector數組的方法:
vector<typename> Arrayname[arraySize];
這樣Arrayname[0] ~ Arrayname[ arraySize - 1 ] 中的每一個元素都是一個vector容器。
與vector<vector<int> > name 不同的是,這種寫法的一維長度已經固定為arraySize,另一維才是"變長"的
vector容器內元素的訪問
vector一般有兩種訪問方式 , 通過下標訪問或通過迭代器訪問。
一、通過下標訪問
和訪問普通的數組是一樣的,對一個定義為vector vi 的容器來說
直接訪問vi[ index ] 即可(如vi[0]、vi[1])。當然這里的下標是從0 到 vi.size()-1。
訪問這個范圍外的元素可能會出錯。
二、通過迭代器訪問
迭代器( iterator ) 可以理解為一種類似指針的東西,其定義是:
vector<typename>::iterator it; //可以迭代器就是定義一個 vector類型的指針
vector<typename>::iterator it; //可以迭代器就是定義一個 vector類型的指針
這樣it 就是一個vector:: iterator型的變量,其中 typename 就是定義vector時填寫的類型。
下面是typename為int和 double 類型的舉例:
vector<int> ::iterator it;
vector<double> ::iterator it;
這樣就得到了迭代器it,并且可以通過 *it 來訪問vector里的元素
從這里可以看出 vi [ i ] 和 * ( vi.begin() + i )是等價的。
上面中的begin()函數的作用為 : 取 a的首元素地址。
end()函數是取a的尾元素地址的下一個地址。end()作為迭代器末尾標志,不存儲任何元素。
除此之外,迭代器還實現了兩種自加操作: ++it 和 it++
于是有了另一種遍歷vector中元素的寫法:
需要注意的是: vector的迭代器不支持 it < v1.end() 寫法,因此循環條件只能用 it != vi.end()
最后需要指出,在常用STL容器中,只有在vector和string中,才允許使用vi.begin()+3這種迭代器加上整數的寫法。
vector常用函數
(1) push_back()
顧名思義,push_back(x)就是在vector后面添加一個元素x,時間復雜度為O(1)。
(2) pop_back()
pop_back()用以刪除vector的尾元素,時間復雜度為O(1)。
注意: pop_back()函數是沒有參數的
(3) size()
size()用來獲得vector中元素的個數,時間復雜度為O(1)。size()返回的是unsigned類型,
不過一般來說用%d不會出很大問題,這一點對所有STL容器都是一樣的。
例子:
(4) clear()
clear()用來清空vector中的所有元素,時間復雜度為O(N),其中N為vector中元素的個數。
(5) insert()
inesrt(it,x)用來向vector的任意迭代器it處插入一個元素x,時間復雜度O(N)。
(6)erase()
erase()有兩種方法: 刪除單個元素、刪除一個區間內的所有元素。時間復雜度都為O(N)。
①刪除單個元素
erase(it) 即刪除迭代器為it處的元素。
②刪除一個區間內的所有元素
erase(first,last)即刪除 [ first , last) 內的所有元素。
上面的說法可以直到,如果要刪除這個vector內的所有元素,
正確的寫法應該是v1.erase( v1.begin() , v1.end() )。
這正如前面說過,v1.end()就是尾元素地址的下一個地址。
當然,更方便的清空vector的方法是使用v1.clear()。
vector的常見用途
(1)存儲數據
- vector本身可以作為數組使用,而且在一些元素個數不確定的場合可以很好地節省空間。
- 有些場合需要根據一些條件把部分數據輸出在同一行,數據中間用空格隔開。
- 由于輸出數據的個數不確定的,為了更方便地處理最后一個滿足條件地數據后面不輸出額外地空格,可以先用vector記錄所有需要輸出的數據,然后一次輸出。
(2)用鄰接表存儲圖
使用vector實現鄰接表可以讓一些對指針不太熟悉的讀者有一個比較方便的寫法。
原文鏈接:https://huixiaoge.blog.csdn.net/article/details/115124891
相關推薦
- 2023-12-12 設置線程名稱(兩種方法)
- 2022-07-30 golang?redis中Pipeline通道的使用詳解_Golang
- 2022-04-10 el-table中使用el-select,選擇后不刷新解決方法
- 2022-04-25 Python如何生成exe文件?用Pycharm一步步帶你學(超詳細、超貼心)_python
- 2022-10-07 Python處理EXCEL表格導入操作分步講解_python
- 2023-06-02 Pandas計算元素的數量和頻率的方法(出現的次數)_python
- 2022-04-11 error: failed to push some refs to 遠程倉庫地址 怎么解決
- 2022-10-14 wget -c 斷點續傳命令
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支