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
vector
- 72