向量容器Vector
- 1. 定義/初始化
- 2. 遍歷
- 3. 常用操作
- vector 迭代器遍歷,sort, reverse,
1. 定義/初始化
vector是同一類型對象的集合,被稱作容器。vector實際是一個類模版,可用于保存多種數據類型的數據(確定類型的vector 就只能裝同種數據)。模版類決定了vector 聲明時需要提供的信息。??Vector 不是一種數據類型,但是vector<int>\text{vector<int>}vector<int>、vector<string>\text{vector<string>}vector<string>,… 都是數據類型。
Vector Vs 數組:
- 動態數組,可以在運行階段設置長度
- 具有數組的快速索引方式
- 可以插入和刪除元素
定義和初始化- -尖角號:范型編程
# include <vector>
using std::vector
vector<T> v1; // vector 保存了類型為T的對象, 默認構造函數,v1 為空
vector<T> v2(v1); // v2 是 v1 的一個副本, 拷貝構造函數?兩個是一個地址?
vector<T> v3(n, i); // v3 包含n個為i 的元素
vector<T> v4(v); // v4 含有值初始化的元素的n個元素,具體初始化值由T的默認構造函數決定vector <double> vec1;
vector <string> vec2(5); //分配5個空間, 使用默認值初始化
vector <int> vec3(5,998); //分配5個空間,使用998初始化
vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19}; // 創建的同時指定初始值以及元素個數
2. 遍歷
vector<int> cards(54, 0);// way1--C 語言的習慣: 傳統for 循環
for(int i = 0; i < cards.size(); i++){cout << cards[i] << "\t";
}
cout << "\n" << endl;// way2--C++語言習慣,迭代器的寫法
for(vector<int>::const_iterator iter = cards.begin(); iter != cards.end(); iter++){cout << *iter << ", ";
}
cout << endl; */// way3--C++11 之后:迭代器的簡寫版本,類型推斷
for(auto iter = cards.begin(); iter != cards.end(); iter++){cout << *iter << "。 ";}cout << endl;// way4--區間遍歷
for(auto card : cards){cout << card << ":" << getColor(card) << "-" << getValue(card) << "\t";
}
cout << endl;// 使用算法的方式,將容器的內容復制到cout 綁定的迭代器中
// #include <iterator>
// copy(cards.cbegin(), cards.cend(), ostream_iterator<int>(cout, "- "));
// cout << endl;
3. 常用操作
vector常有的操作:
常用操作 | |
---|---|
clear() | 移除容器中的所有數據 |
empty() | 判斷容器是否為空 |
size() | 返回容器中元素的個數 |
[index],at(index) | 返回索引為index的元素 |
erase(pos) | 刪除pos 位置處的數據 |
erase(beg, end) | 刪除[beg, end) 區間的數據 |
front() | 返回第一個元素 |
insert(pos, elem) | 在pos位置插入一個元素 |
pop_back() | 刪除最后一個元素 |
push_back(elem) | 在容器的末尾插入一個元素 |
resize(num) | 重新設置一個容器的大小 |
begin(),end() | 返回容器首尾元素的迭代器 |
新增兩個頭文件
#include <vector>
#include <algorithm>
vector 迭代器遍歷,sort, reverse,
int main(){// vector <double> vectDouble = {98.5, 67.9, 43.6, 32.9}; c++ 98 中不能初始化并賦初值vector <double> vectDouble;// 向數組中插入數字vectDouble.push_back(100.8);vectDouble.push_back(99.8);vectDouble.push_back(102.5);// 不專業輸出for(int i = 0; i < vectDouble.size(); i++){cout << vectDouble[i] << "\t";}// 集合的通用遍歷方法,使用迭代器 iteratorvector<double>::iterator it; //定義一個vector<double>類型的迭代器, 實際上是一個指針for(it = vectDouble.begin(); it != vectDouble.end(); it++){cout << *it << "\t";}// 排序sort(vectDouble.begin(), vectDouble.end());for(it = vectDouble.begin(); it != vectDouble.end(); it++){cout << *it << "\t";}//逆序reverse(vectDouble.begin(), vectDouble.end());for(it = vectDouble.begin(); it != vectDouble.end(); it++){cout << *it << "\t";}return 0;
}
定義多大多大,push_back會/可以改變容量,但是效率不高。
當內存容量不夠的時候的應對機制:申請一塊更大的存儲區,將所有的元素放入到新的存儲區中。將舊的內存釋放掉。
建議vector中不要放復雜對象,要放指針。(這么處理的妙處??)