一、標準庫中的vector類
1.vector的介紹
1. vector是表示可變大小數組的序列容器 , 和數組一樣,vector可采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大小是可以動態改變的,而且它的大小會被容器自動處理。2. 本質講,vector使用動態分配數組來存儲它的元素。當新元素插入時候,這個數組需要被重新分配大小,以增加存儲空間。其做法是:分配一個新的數組,然后將全部元素移到這個數組。就時間而言,這是一個代價相對來說高的任務,因為每當一個新的元素加入到容器的時候,vector并不會每次都重新分配大小。3. vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為存儲空間比實際需要的存儲空間更大。不同的庫采用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是對數增長的間隔大小,以至于在末尾插入一個元素的時候是在常數時間的復雜度完成的。4. 因此,vector占用了更多的存儲空間,為了獲得管理存儲空間的能力,并且以一種有效的方式動態增長。5. 與其它動態序列容器相比(deque, list and forward_list), vector在訪問元素的時候更加高效,在末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入操作,效率更低。比起list和forward_list統一的迭代器和引用更好?
2.vector的使用
記住,學stl一定一定要學會看文檔,vector文檔.vector在實際中非常的重要,在實際中我們熟悉常
2.1?常用的構造函數
vector();
vector類的默認構造函數,構造一個沒有元素的空容器
例如:
void test()
{vector<int> v;
}
都需要引用頭文件vector
vector(size_type n, const value_type& val = value_type());
構造一個vector類對象并用n個val初始化
例如:
void test()
{//vector<int> v;vector <int> v(5, 0);for (auto i : v){cout << i << " ";}
}
int main()
{test();return 0;
}
運行結果:
void test()
{//vector<int> v;vector <int> v(5, 2);for (auto i : v){cout << i << " ";}
}
int main()
{test();return 0;
}
運行結果:
拷貝構造函數
vector(const vector& x);
對于一個已有的vector容器進行拷貝,并生成一個新的容器
例如:
void test()
{//vector<int> v;vector <int> v1(5, 2);vector <int> v2(v1);for (auto i : v2){cout << i << " ";}
}
運行結果:v

使用迭代器的初始化構造
Template<class InputIterator>vector(InputIterator first, InputIterator last);
例如:
void test()
{//vector<int> v;vector <int> v1(5, 2);//vector <int> v2(v1);vector <int> v2(v1.begin(),v1.end()-1);for (auto i : v2){cout << i << " ";}
}
運行結果v:
2.2 容量操作的接口
1.size
size_type size() const;
獲取有效元素的個數
例如:
void test()
{//vector<int> v;vector <int> v1(5, 2);//vector <int> v2(v1);/*vector <int> v2(v1.begin(),v1.end()-1);*///for (auto i : v2)//{// cout << i << " ";//}cout << v1.size();
}
int main()
{test();return 0;
}
運行結果:
2.capacity
獲取容量大小
size_type capacity() const;
例如:
void test()
{vector <int> v1(5, 2);cout << v1.capacity();
}
運行結果:
3.empty
判斷容器是否為空
bool empty() const;
例如:
?
void test()
{vector <int> v1(5, 2);vector <int> v2;cout << v1.empty() << endl;cout << v2.empty() << endl;
}?
運行結果:
4.resize
void resize (size_type n, value_type val = value_type());
將有效元素的個數修改為n,并且如果n大于原來的size,多出來的地方用val填充
如果沒有給出val,就用0填充
例如:
void test()
{vector <int> v;cout << v.size() << endl;v.resize(20);cout << v.size() << endl;for (auto i : v){cout << i << " ";}cout << endl;v.resize(30);cout << v.size() << endl;for (auto i : v){cout << i << " ";}cout << endl;v.resize(10);cout << v.size() << endl;for (auto i : v){cout << i << " ";}
}
運行結果:
5.max_size
size_type max_size() const;
返回最大大小
例如:
ps:這里push_back是尾插
void test1()
{vector <int> v;for (int i = 0; i < 100; i++) v.push_back(i);cout << v.size() << endl;
}
運行結果:
6.reserve?????
void reserve (size_type n);
改變容量大小
例如:
void test1()
{vector <int> v;cout << v.capacity() << endl;v.reserve(10);cout << v.capacity() << endl;
}
運行結果:
2.3vector的訪問及其遍歷
1.operator[]
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
用下標直接訪問
例如:
void test()
{vector <int> v(5,2);cout << v[2] << endl;
}
運行結果:
因此我們也可以通過下標去遍歷,這里就不多作演示
2.迭代器
這里大體和string類差不多
iterator begin();const_iterator begin() const;iterator end();const_iterator end() const;
迭代器,用于獲取容器中第一個元素的位置和最后一個元素的下一個位置
例如:
?
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}
}?
運行結果:
3.反向迭代器
這個整體和迭代器差不多
reverse_iterator rbegin();const_reverse_iterator rbegin() const;reverse_iterator rend();const_reverse_iterator rend() const;
rbegin獲取容器中最后一個元素的位置,rend獲取容器中的第一個元素的前一個位置
例如:
?
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";++rit;}
}?
運行結果:
4.at
reference at (size_type n);
const_reference at (size_type n) const;
返回容器中位置n處的元素的引用
例如:
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };cout << v.at(5) << endl;for (size_t i=0;i<v.size();++i){cout << v.at(i) << " ";}
}
運行結果:
5.back
reference back();
const_reference back() const;
返回容器中最后一個元素的引用
例如:
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.back()<< endl;
}
運行結果:
6.front
reference front();
const_reference front() const;
返回容器中第一個元素的引用
例如:
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.front()<< endl;
}
運行結果:
2.4vector的增刪查改
1.push_back();
void push_back(const value_type& val);
從容器尾部插入一個元素
例如:
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.back()<< endl;v.push_back(99999);cout << v.back() << endl;
}
運行結果:
2.pop_back()
void test()
{vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };cout << v.back()<< endl;v.pop_back();cout << v.back() << endl;
}
運行結果:
3.find()
template <class InputIterator, class T>InputIterator find(InputIterator first, InputIterator last, const T& val);
在兩個迭代器區間尋找val并返回其所在處的迭代器
例如:
void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 3);*it = 30;for (auto i : v){cout << i << " ";}cout << endl;
}
需要注意的是,該函數并非vector的成員函數,是標準庫中的函數,多個容器共用該find函數
4.insert()
iterator insert (iterator position, const value_type& val);
void insert (iterator position, size_type n, const value_type& val);template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
在position位置插入元素
例如:
void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 3);v.insert(it, 99999);for (auto i : v){cout << i << " ";}cout << endl;
}
運行結果:
5.earse()
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
刪除position位置的元素或者 [first,last) 區間的所有元素
例如:
void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 3);v.erase(it);for (auto i : v){cout << i << " ";}cout << endl;
}
運行結果:
6.swap()
void swap (vector& x);
交換兩個vector的數據空間
例如:
void test3()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9,0 };vector<int> v2 = { 0,9,8,7,6,5,4,3,2,1 };v1.swap(v2);for (auto i : v1){cout << i << " ";}cout << endl;
}
運行結果:
7.assign()
template <class InputIterator> void assign (InputIterator first, InputIterator last);
void assign (size_type n, const value_type& val);
為vector指定新內容,替換其當前內容并修改size
例如:
void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << endl;v.assign(5, 4);for (auto i : v){cout << i << " ";}cout << endl;
}
運行結果:
8.clear()
void clear();
從vector中刪除所有元素,不改變容量大小
例如:
void test2()
{vector<int> v = { 1,2,3,4,5,6 };for (auto i : v){cout << i << " ";}cout << "size:" << v.size();cout << endl;v.clear();for (auto i : v){cout << i << " ";}cout << "size:" << v.size();cout << endl;
}
運行結果:
本篇是對vector的初步理解,我們只需知道會用即可
如有錯誤,歡迎大家在評論區指出。