Vector

by 洪翠憶

Vector?

Introduction

  • Introduction of vector
  • Declare a vector

Introduction

  • 會自動擴展容量的陣列

  • C++容器

  • 在<vector>之中

  • 支援隨機存取

  • 可儲存任意類型

  • 使用迭代器(Iterator)

Declare a Vector

#include <vector>
⋮
std::vector<型態> 名稱 (初始內容[選填]);

//宣告範例
std::vector<int> emp;  //宣告一個可儲存int的空的向量
std::vector<int> fs (5, 7);  //裡面放了5個7的向量
std::vector<int> itfs (fs.begin(), fs.end()-1);  //少了1個7的fs
std::vector<int> cofs (fs);  //內容是fs
#include <iostream>
#include <vector>

int main(){
    std::vector<char> say;
    say.push_back('h');
    say.push_back('i');
    say.push_back('!');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    say.erase(say.begin()+1, say.begin()+2);
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    say.insert(say.begin()+1, 'e');
    say.insert(say.begin()+2, 'y');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}

'h'

'i'

'!'

say

hi!

#include <iostream>
#include <vector>

int main(){
    std::vector<char> say;
    say.push_back('h');
    say.push_back('i');
    say.push_back('!');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    say.erase(say.begin()+1, say.begin()+2);
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    say.insert(say.begin()+1, 'e');
    say.insert(say.begin()+2, 'y');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}

'h'

'i'

'!'

say

h!

'!'

#include <iostream>
#include <vector>

int main(){
    std::vector<char> say;
    say.push_back('h');
    say.push_back('i');
    say.push_back('!');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    say.erase(say.begin()+1, say.begin()+2);
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    say.insert(say.begin()+1, 'e');
    say.insert(say.begin()+2, 'y');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}

'h'

'!'

say

hey!

'!'

'y'

'e'

Access Vector Items

  • []
  • at()
  • front()
  • back()

Syntax

向量[索引值]
//回傳該索引值所指向的值(跟陣列的用法一樣)

向量.at(索引值)  //同上

向量.front()  //回傳第一個值

向量.back()  //回傳最後一個值

Example

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi!";
    std::vector<char> say (hi, hi+3);
    std::cout << say[1] << ' ';
    std::cout << say.at(1) << ' ';
    std::cout << say.front() << ' ';
    std::cout << say.back() << ' ';
    return 0;
}
//i i h !

Change Vector Items

  • assign()
  • push_back()
  • pop_back()
  • insert()
  • erase()
  • swap()
  • clear()

assign()

#include <iostream>
#include <vector>

int main(){
    std::vector<char> say;
    say.assign(3, '~');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    
    char hi[] = "hi";
    say.assign(hi, hi+2);
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}
/*
~~~
hi
*/
向量.assign(數量, 值);
//初始化向量,在向量中放入指定數量的值

向量.assign(其他容器迭代器的頭, 其他容器迭代器的尾)
//將其他容器的指定區域的值成為此向量的初始值

push_back()

#include <iostream>
#include <vector>

int main(){
    std::vector<char> say;
    say.push_back('h');
    say.push_back('i');
    say.push_back('!');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}
//hi!
向量.push_back(值);  //新增值至最後一項

pop_back()

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi!";
    std::vector<char> say (hi, hi+3);
    say.pop_back();
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}
//hi
向量.pop_back();  //刪除最後一個值

insert()

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi";
    std::vector<char> say (hi, hi+2);
    
    say.insert(say.end(), 'j');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    
    say.insert(say.begin(), 2, 'g');
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}
/*
hij
gghij
*/
向量.insert(迭代器, 數量[選填], 值);
//在指定位置(迭代器)中,插入指定數量的值

erase()

#include <iostream>
#include <vector>

int main(){
    char hi[] = "gghij";
    std::vector<char> say (hi, hi+5);
    
    say.erase(say.end()-1);
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    
    say.erase(say.begin()+2, say.end());
    for(int i = 0, sayS = say.size(); i < sayS; i++)
        std::cout << say[i];
    std::cout << '\n';
    return 0;
}
/*
gghi
gg
*/
向量.erase(迭代器的頭, 迭代器的尾[選填]);
//刪除迭代器選中的值

swap()

#include <iostream>
#include <vector>

int main(){
    std::vector<int> a (3, 1);
    std::vector<int> b (5, 1);
    std::cout << a.size() << ' ' << b.size() << '\n';
    a.swap(b);
    std::cout << a.size() << ' ' << b.size() << '\n';
    return 0;
}
/*
3 5
5 3
*/
向量1.swap(向量2);  //交換向量1、向量2的內容

clear()

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi!";
    std::vector<char> say (hi, hi+3);
    say.clear();
    std::cout << say.size() << '\n';
    return 0;
}
//0
向量.clear();  //清空向量

Get Vector Capacity

  • size()
  • empty()

size()

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi!";
    std::vector<char> say (hi, hi+3);
    std::cout << say.size() << '\n';
    return 0;
}
//3
向量.size()  //回傳向量的長度

empty()

#include <iostream>
#include <vector>

int main(){
    std::vector<char> say;
    std::cout << say.empty() << ' ';
    char hi[] = "hi!";
    say.assign(hi, hi+3);
    std::cout << say.empty() << ' ';
    return 0;
}
//1 0
向量.empty()  //如果向量是空的,回傳true

Iterators

  • begin()
  • end()
  • rbegin()
  • rend()
  • Declare an iterator

'h'

'e'

'l'

vec_s

'l'

'o'

'!'

vec_s.begin()

vec_s.end()

vec_s.rbegin()

vec_s.rend()

Example

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi!";
    std::vector<char> say (hi, hi+3);
    std::vector<char> s (say.begin(), say.end());
    std::vector<char> rs (say.rbegin(), say.rend());
    for(int i = 0, sayS = s.size(); i < sayS; i++)
        std::cout << s[i];
    std::cout << '\n';
    for(int i = 0, sayS = rs.size(); i < sayS; i++)
        std::cout << rs[i];
    std::cout << '\n';
    return 0;
}
/*
hi!
!ih
*/

Declare an Iterator

#include <vector>
⋮
std::vector<型態>::iterator 名稱 = 值;

//宣告範例
std::vector<char> say (3, 'h');
std::vector<char>::iterator it = say.begin();
auto ite = say.begin();

Example

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi!";
    std::vector<char> say (hi, hi+3);
    for(std::vector<char>::iterator i = say.begin(); i != say.end(); i++)
        std::cout << *i;
    std::cout << '\n';
    return 0;
}
//hi!

凍凍腦><

Q1.

#include <iostream>
#include <vector>

int main(){
    std::vector<int> fs (5, 7);
    std::vector<int> itfs (fs.begin(), fs.end());
    std::vector<int> cofs (fs);
    std::cout << fs.size() << ' ';
    std::cout << itfs.size() << ' ';
    std::cout << cofs.size() << ' ';
    fs.pop_back();
    std::cout << fs.size() << ' ';
    std::cout << itfs.size() << ' ';
    std::cout << cofs.size() << ' ';
    return 0;
}
//5 5 5 4 5 5 

VS

std::vector<int> itfs (fs.begin(), fs.end());
std::vector<int> cofs (fs);

A: 沒差

Q2.

#include <iostream>
#include <vector>

int main(){
    char hi[] = "hi!";
    std::vector<char> say (hi, hi+3);
    std::cout << say[3] << '\n';
    std::cout << say.at(3) << '\n';
    return 0;
}

[] VS at()

A: at()會回傳錯誤訊息

Q3.

在向量中間插入值,與在向量最後推入值,哪個消耗的時間較短?

A: 

在中間插入值時O(n)

在末端推入值時是O(1)

Kahoot!

References

vector

By zsisc28_0okatrinao0