c++ vector 賦值_C++中vector用法
技術標籤:c++ vector 賦值c++ vector排序c++ vector最大值c++ vector賦值c++vector替換元素vector assign
vector是什麼
vector是C++標準模板庫(STL-Standard Template Library)中的概念內容,它是一個能夠操作多種資料結構和演算法的模板類和函式庫,是一個封裝了動態大小陣列的順序容器(Sequence Container)。vector被認為是一個容器,也是因為它能夠像容器一樣存放各種型別的物件,可以簡單的認為,vector是一個能夠存放任意型別的動態陣列。
擴充套件知識:
STL的程式碼從廣義上講分為三類:algorithm(演算法)、container(容器)和iterator(迭代器),幾乎所有的程式碼都採用了模板類和模板函式的方式,這相比於傳統的由函式和類組成的庫來說提供了更好的程式碼重用機會。
模板是C++程式設計語言中的一個重要特徵,而標準模板庫正是基於此特徵。標準模板庫使得C++程式語言在有了同Java一樣強大的類庫的同時,保有了更大的可擴充套件性。
容器:包含、放置資料的地方。
迭代器:在容器中指出一個位置、或成對使用以劃定一個區域,用來限定操作所涉及到的資料範圍。
演算法:要執行的操作。
容器特性
關於STL容器,最令人稱讚的特性之一就是隻要不超過它們的最大容許元素數量值(容量),它們就可以自動增長到足以容納放進去的資料(要想知道這個最大值,呼叫max_size的容器的內建成員函式即可,使用reserve()函式可以提前設定容量大小)。
1.順序序列
順序容器中的元素按照嚴格的線性順序排序。可以通過元素在序列中的位置訪問對應的元素。
2.動態陣列
支援對序列中的任意元素進行快速直接訪問,甚至可以通過指標算述進行該操作。操供了在序列末尾相對快速地新增/刪除元素的操作。
3.能夠感知記憶體分配器的(Allocator-aware)
容器使用一個記憶體分配器物件來動態地處理它的儲存需求。
vector內建基本函式
(往右滑動可看全表格資訊)
函式原型 | 說明 |
---|---|
建構函式: | |
vector() | 建立一個空vector |
vector(int nSize) | 建立一個vector,元素個數為nSize |
vector(int nSize,const t& t) | 建立一個vector,元素個數為nSize,且值均為t |
vector(const vector&) | 複製建構函式 |
vector(begin,end) | 複製[begin,end)區間內另一個數組的元素到vector中 |
增加函式: | |
void push_back(const T& x) | 向量尾部增加一個元素X |
iterator insert(iterator it,const T& x) | 向量中迭代器指向元素前增加一個元素x |
iterator insert(iterator it,int n,const T& x) | 向量中迭代器指向元素前增加n個相同的元素x |
iterator insert(iterator it,const_iterator first,const_iterator last) | 向量中迭代器指向元素前插入另一個相同型別向量的[first,last)間的資料 |
刪除函式: | |
iterator erase(iterator it) | 刪除向量中迭代器指向元素 |
iterator erase(iterator first,iterator last) | 刪除向量中[first,last)中元素 |
void pop_back() | 刪除向量中最後一個元素 |
void clear() | 清空向量中所有元素 |
遍歷函式: | |
reference at(int pos) | 返回pos位置元素的引用 |
reference front() | 返回首元素的引用 |
reference back() | 返回尾元素的引用 |
iterator begin() | 返回向量頭指標,指向第一個元素 |
iterator end() | 返回向量尾指標,指向向量最後一個元素的下一個位置 |
reverse_iterator rbegin() | 反向迭代器,指向最後一個元素 |
reverse_iterator rend() | 反向迭代器,指向第一個元素之前的位置 |
判斷函式: | |
bool empty() const | 判斷向量是否為空,若為空,則向量中無元素 |
大小函式: | |
int size() const | 返回向量中元素的個數(實際資料的個數) |
int max_size() const | 返回最大可允許的vector元素數量值 |
int capacity() const | 返回當前向量所能容納的最大元素值 |
其他函式: | |
void swap(vector&) | 交換兩個同類型向量的資料 |
void assign(int n,const T& x) | 設定向量中第n個元素的值為x |
void assign(const_iterator first, const_iterator last) | 向量中[first,last)中元素設定成當前向量元素 |
程式碼eg
vector物件的初始化eg:
假設定義的是int型vector向量,可以有如下方式:
//定義具有10個int型元素的向量(尖括號為元素型別名,它可以是任何合法的資料型別),不具有初值,其值不確定 vectora(10); //定義具有10個整型元素的向量,且給出的每個元素初值為1 vectora(10,1); //用向量b給向量a賦值,a的值完全等價於b的值 vectora(b); //將向量b中從0-2(共三個)的元素賦值給a,a的型別為int型 vectora(b.begin(),b.begin+3); //從陣列中獲得初值 int b[7]={1,2,3,4,5,6,7}; vector a(b,b+7);
定義其他型別的vector,如使用自定義的列舉型eg:
typedef enum { EVENT_A = -1 EVENT_B, EVENT_C, EVENT_UNKNOWN, } event_type_t; //定義一個自定義列舉型vector Vector event;
vector物件的常用函式eg:
//包含標頭檔案 #include //定義int型vector向量a和b vector a,b; //b為向量,將b的0-2個元素賦值給向量a a.assign(b.begin(),b.begin()+3); //a含有4個值為2的元素 a.assign(4,2); //返回a的最後一個元素 a.back(); //返回a的第一個元素 a.front(); //返回a的第i元素,當且僅當a存在 a[i]; //清空a中的元素 a.clear(); //判斷a是否為空,空則返回true,非空則返回false a.empty(); //刪除a向量的最後一個元素 a.pop_back(); //刪除a中第一個(從第0個算起)到第二個元素,也就是說刪除的元素從a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)結束 a.erase(a.begin()+1,a.begin()+3); //在a的最後一個向量後插入一個元素,其值為5 a.push_back(5); //在a的第一個元素(從第0個算起)位置插入數值5, a.insert(a.begin()+1,5); //在a的第一個元素(從第0個算起)位置插入3個數,其值都為5 a.insert(a.begin()+1,3,5); //b為陣列,在a的第一個元素(從第0個元素算起)的位置插入b的第三個元素到第5個元素(不包括b+6) a.insert(a.begin()+1,b+3,b+6); //返回a中元素的個數 a.size(); //返回a在記憶體中總共可以容納的元素個數 a.capacity(); //將a的現有元素個數調整至10個,多則刪,少則補,其值隨機 a.resize(10); //將a的現有元素個數調整至10個,多則刪,少則補,其值為2 a.resize(10,2); //將a的容量擴充至100, a.reserve(100); //b為向量,將a中的元素和b中的元素整體交換 a.swap(b); //b為向量,向量的比較操作還有 != >= > <= < a==b
用push_back給向量尾部增加多個元素,體會一下eg:
//定義一個int型vector vector a; //分別先後把5和10壓入vector,最後向量儲存是這樣:a[0]是5,a[1]就是10 a.push_back(5); a.push_back(10);
用vector作為函式的引數或者返回值時,需要注意寫法eg:
//注意“&”,一定記得寫上,不能丟掉 double test(vector<int>&a, vector<int>&b)
用迭代器iterator訪問vector元素eg:
vector a; //定義一個可以迭代int型vector的迭代器iter,並使它指向a的首位(地址) vector::iterator iter = a.begin(); //iter++指的是向後迭代一位,直到iter到超出末端迭代器為止,輸出迭代器iter指向的值 for( ; iter!=a.end(); iter++) cout<
往期文章
>專輯 | C/C++細碎
>linux開發vi/vim使用知多少
>手機螢幕封裝技術及其分類相關知識
>我應該更早一點認識Git
>大端小端詳解(含程式碼及詳細註釋)
>你真的瞭解開源嗎
>淺談ARM ABI,Android ABI
>CPU、ARM、架構(及指令集)關係
>我畢業了(來自小學妹的畢業隨筆)
如果覺得文章有用,幫忙點贊或在看,給個心裡安慰