# vector

# 標頭檔

#include<vector>

# 構造器 && 初始化

  1. 默認構造器:empty container constructor
  2. 批量構造器:fill constructor
  3. 範圍構造器:range constructor
  4. 複製構造器:copy constructor
#include<vector>
#include<iostream>
using namespace std;
void print(vector<int> temp)
{
    cout<<endl;
    for(auto x: temp)
        cout<<x<<" ";
    cout<<endl;
}
int main(){
    vector<int> v1; // 默認構造器
    vector<int> v{1,2}; // 默認構造器
    vector<int> v2(6,10); // 批量構造器
    vector<int> v3(v2.begin(),v2.begin()+5); // 範圍構造器
    vector<int> v4(v); // 複製構造器
    print(v);
    print(v2);
    print(v3);
    print(v4);
    return 0;
}

輸出

1 2 
10 10 10 10 10 10  //六個10
10 10 10 10 10
1 2

# push_back && pop_back

vector 最常用的成員函數,在尾部插入和刪除

# assign

int main(){
    vector<int> test;
    test.assign(2,3); // 批量構造,構造兩個值為 3 的 element
    print(test);
    test.assign(2,8); // 會覆蓋原有值
    print(test);
}

輸出

3 3
8 8

# insert

在指定位置插入一個或多個值,(位置的類型是反覆運算器), 但若是插入操作過多,使用 vector 時間複雜度會非常高
vector 中插入值時,會將插入值後的所有值依次後移

重載函數形参
插入單個值 [1]iterator insert (const_iterator position, const value_type& val);
多個重複值 [2]iterator insert (const_iterator position, size_type n, const value_type& val)
range [3]iterator insert (const_iterator position, InputIterator first, InputIterator last)
int main(){
    vector<int>test(2,8);
    vector<int> test1(test);
    test.insert(test.begin(),3); //[1]
    print(test);
    auto ite =test.insert(test.begin(),test1.begin(),test1.end());//[3]
    print(test);
    cout<<*ite<<endl; //insert 返回指針地址
}

輸出

3 8 8 
8 8 3 8 8 
8

# erase

刪除指定位置的值

重載函數形參
singleiterator erase (const_iterator position)
rangeiterator erase (const_iterator first, const_iterator last)
int main(){
    vector<int> test;
    test.assign(4,3); // 批量構造,構造兩個值為 3 的 element
    test.push_back(66);
    cout<<"initial element\n"; 
    print(test);
    test.erase(test.end()-1); // 刪除尾部元素,注意不要越界
    print(test);
    test.erase(test.begin(),test.end()-2);// 刪除操作依舊複雜度高,容易 TLE
    print(test);
}

輸出

initial element
3 3 3 3 66 
3 3 3 3 
3 3 

# empty

如果 vector 為空, empty 返回 true ;

# size

返回 vector 容器元素個數

# emplace && emplace_back

C++11 的新特性,在幾乎所有的容器中都插入了這一函數,這一函數功能類似於 insert , 但是開銷遠小於 insert , 它不產生臨時變數

vector<pair<int,double>> vec;//vector 中嵌套 pair
vec.push_back(make_pair(1,1.0));// 常用的構造方式
vec.emplace(vec.end(),1,2.0);//emplace 的構造方式

方便是方便,但簡單的尾部插入還要寫地址,豈不繁瑣,當然不是,C++11 也提供了 emplace_back 這一函數

vec.emplace_back(1,2.0);//emplace_back 的構造方式,不需寫尾部位址

# resize

更改 vectorelement 個數

int main(){
    vector<int> v;
    for (int i=1;i<10;i++) v.push_back(i);
    v.resize(5);// 縮小容量到 5, 尾部多餘的 `element` 被刪除
    print(v);
    v.resize(8,100);// 擴容到 8, 用 100 填值
    print(v);
    v.resize(12);// 使用 0 填值
    print(v);
}

輸出

1 2 3 4 5
1 2 3 4 5 100 100 100
1 2 3 4 5 100 100 100 0 0 0 0

# clear

刪除 vector 中的所有元素,如果有析構函式呼叫各自的析構函數,但是 clear 不刪除 vector 的容量,
vector 的容量是自身佔用的記憶體值,不是其中包含的 element 的具體大小,為了效率考慮, vector 分配的記憶體值都是大於或等於已使用的記憶體值
例子

int main(){
    vector<pair<int,double>> vec;//vector 中嵌套 pair
    vec.push_back(make_pair(1,1.0));// 常用的構造方式
    vec.emplace_back(1,2.0);//emplace_back 的構造方式 
    cout<<vec.capacity()<<" "<<vec.size()<<endl;
    vec.clear();
    cout<<vec.capacity()<<" "<<vec.size()<<endl;
}

輸出

2 2
2 0//容量是不變的

對於即將再次被使用的容器,這樣做效率無疑更高,但對於即將丟棄的 vector , 有沒有可以徹底善後的方法

# swap

該函數用於交換兩個 vector 容器的內容,那麼假如交換一個空 vector 呢?

using pa =pair<int,double>;
int main(){
    vector<pa> vec;//vector 中嵌套 pair
    vec.push_back(make_pair(1,1.0));// 常用的構造方式
    vec.emplace_back(1,2.0);//emplace_back 的構造方式 
    cout<<vec.capacity()<<" "<<vec.size()<<endl;
    vec.clear();
    cout<<vec.capacity()<<" "<<vec.size()<<endl;
    vector<pa> (vec).swap(vec); // 交換一個空容器
    cout<<vec.capacity()<<" "<<vec.size()<<endl;
}

輸出

2 2 //初始容量
2 0 //調用clear後
0 0 //交換空容器後,整個vector 全部清空了

幾乎很少會在演算法題中使用,貿然使用可能會弄巧成拙

更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay