vector用法_part1



Vector是C++標準程式庫中的一個類,可視為會自動擴展容量的陣列,是C++標準程式庫中的眾多容器(container)之一,以循序(Sequential)的方式維護變數集合,使用前預先#include "vector" 即可

vector<int> v;

0. vector 快速使用

vector<int> v1;
vector<double> v2;

// 清除內容, 重新設大小
v1.clear(), v2.clear();
v1.resize(5);
v2.resize(10);

// 新增元素
int i;

方法一.  用 push_back() 方法  會把元素安插自後頭(尾巴)

for(i=0; i<v1.size(); i++)
      v1.push_back(i);

方法二.  陣列指定法

for(i=0; i<v2.size(); i++)
      v2[i] = double(i);



1. 大小控制

(1.1) 檢查是否為空:v.empty();
(1.2) 直接將v清空:v.clear();
(1.3) 檢查目前大小:v.size();
(1.4) 檢查最大容量:v.maxsize();
(1.5) 檢查目前容量:v.captacity();
(1.6) 清除所有內容:v.clear();
(1.7) 清除指定元素:v.erase(v.begin());  v.erase(v.end()-1);
(1.8) 讀取並刪除最後一元素:v.pop_back(v.size()-1);
(1.9) 重新設定大小:v.resize(5);

#include <time.h>
#include <stdio.h>
#include<iostream>
#include <ctype.h>
#include <opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\video\background_segm.hpp>
#include <vector>

using namespace cv;
using namespace std;

//vector<double> v2;
int main(int argc, char** argv)
{
    // 空的 vector<int>初始化
    cout << "整數vector之初始化" << endl;
    vector<int> iVec; //建立空之 vector
    cout << "容器 大小為: " << iVec.size() << endl;
    cout << "容器 容量為: " << iVec.capacity() << endl; //0個元素,容器容量為0

    cout << "\n";
    cout << "----------------------";
    cout << "\n";
    
    // vector<int> 指定範圍(元素個數、元素值)之初始化
    vector<int> iVec2(3, 5);//將v設成3個元素,每個元素都設5
    cout << "容器 大小為: " << iVec2.size() << endl;
    cout << "容器 容量為: " << iVec2.capacity() << endl; //3個元素,容器容量為3
    cout << "第一種元素列印法.at()" << endl;
    cout << "第一個元素:" << iVec2.at(0) << endl;
    cout << "第二個元素:" << iVec2.at(1) << endl;
    cout << "第三個元素:" << iVec2.at(2) << endl;
    //cout << "第四個元素:" << iVec2.at(3) << endl; // 加了會出錯 元素最多就到編號2
    cout << "resize之後的結果" << endl;
    iVec2.resize(6);
    cout << "容器 大小為: " << iVec2.size() << endl;
    cout << "容器 容量為: " << iVec2.capacity() << endl;
    cout << "第一個元素:" << iVec2.at(0) << endl;
    cout << "第二個元素:" << iVec2.at(1) << endl;
    cout << "第三個元素:" << iVec2.at(2) << endl;
    cout << "第四個元素:" << iVec2.at(3) << endl;
    cout << "第五個元素:" << iVec2.at(4) << endl;
    cout << "第六個元素:" << iVec2.at(5) << endl;
    

    iVec2.push_back(3);// 會插放到後頭
    cout << "基於Mat的vector = " << Mat(iVec2) << endl ;
    cout << "容器 大小為: " << iVec2.size() << endl;
    cout << "容器 容量為: " << iVec2.capacity() << endl; //3個元素,容器容量為3


    

    system("PAUSE");
    return 0;
}

關於 v.resize() 要說明一下,若開始是使用 vector<int> v(3,5),將v設成3個元素,每個元素都設5,之後調用 v.resize(2) 之後,邊界大小被調成2 ,若再調用 v.resize(6),則 v[0], v[1] 為 5,v[2]~v[5] 為 0。


(1.10) 自動掌控大小:v.reserve(6)

和 v.resize() 有所不同,v.resize() 是將 vector 重新調整大小。若開始是用 vector<int> v(3, 5),使用 v.reserve(6),實際上 vector v 之大小仍為3,同時調用 v.at(3) 仍將失敗。





新增或移除元素的用法


  • vec.push_back() - 新增元素至 vector 的尾端,必要時會進行記憶體配置。
  • vec.pop_back() - 刪除 vector 最尾端的元素。
  • vec.insert() - 插入一個或多個元素至 vector 內的任意位置。
  • vec.erase() - 刪除 vector 中一個或多個元素。
  • vec.clear() - 清空所有元素。



存取元素的用法


  • vec[i] - 存取索引值為 i 的元素參照。
  • vec.at(i) - 存取索引值為 i 的元素的參照,
  • vec.front() - 回傳 vector 第一個元素的參照。
  • vec.back() - 回傳 vector 最尾元素的參照。


每個 vector 都有兩個重要的數字:容量 (capacity) 和長度 (size) 。
容量 (capacity) : 是這個 vector  擁有的空間。
長度 (size) : 是實際儲存了元素的空間大小。capacity 不小於 size 是個不變條件。


reserve() 的目的是擴大容量。做完時,vector 的長度不變,capacity 只會長大不會縮小,資料所在位置可能會移動(因為會重配空間)。因為 vector 一開始是空的,立刻預留顯然比填了資料後才預留省了拷資料的時間。
* 重配空間 : 配置新空間、拷資料、歸還舊空間、更新陣列位置。

resize() 的目的是改變 vector 的長度。做完時,vector 的長度會改變為指定的大小,capacity 則視需要調整,確保不小於 size,資料所在位置可能會移動。如果變小就擦掉尾巴的資料,如果變大就補零。補零如果會超過容量,會做重配空間的動作。

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header