【c++】容器vector
vector是一個變長陣列容器類模板,資料在vector中連續儲存
建構函式:
vector()
explicit vector(const _Alloc& _Al)
vector<int> A; //建立一個空的的容器
explicit vector(size_type _Count)
vector<int> B(10); //建立一個具有10個int元素的容器
vector(size_type _Count, const _Ty& _Val)
vector(size_type _Count, const _Ty& _Val, const _Alloc& _Al)
vector<int> C(10,100); //建立一個具有10個型別為int值為100元素的陣列
vector(const _Myt& _Right)
vector<int> D(C); //建立容器D,完全複製容器C
vector(_Iter _First, _Iter _Last)
vector(_Iter _First, _Iter _Last, const _Alloc& _Al)
vector<int> C(B.begin()+2,B.end()); //使用迭代器,可以取部分元素建立一個新的容器
解構函式:
~vector() //銷燬容器物件並回收了所有分配的記憶體
運算子過載:
C++ Vectors能夠使用標準運算子: ==, !=, <=, >=, <, 和 >.
vector<int> A(5, 2);
vector<int> B = A; //賦值
// 兩個vectors被認為是相等的,如果: 1.它們具有相同的容量;2.所有相同位置的元素相等.
if(A == B); //true
B.[1] = 5; //下標操作符
cout << B.front() << endl; //2 B (2 5 2 2 2)
// 依次比較容器內每個元素
if(A < B) //true
cout << "A < B" <<endl; //執行
else
cout << "A >= B" <<endl; //不執行
成員函式:
================================
void assign(_Iter _First, _Iter _Last)
void assign(size_type _Count, bool _Val)
將丟棄原來的元素然後重新分配元素,第一個函式是使用迭代器,第二個函式是使用n個元素,每個元素的值為u
vector<int> A(3,1); // A(1 1 1)
A.assign(15,2); // A(2 2 2 2 2 ...)
cout <<A.size()<<endl; //15
vector<int> C(10,6);
vector<int>::iterator First = C.begin();
vector<int>::iterator End = C.end()-2;
A.assign(First,End); //相當於將C的一部分給A
cout <<A.size()<<endl;// 8
================================
const_reference at(size_type _Pos) const
reference at(size_type _Pos)
在函式的操作方面和下標訪問元素一樣,不同的是當這個函式越界時會丟擲一個異常out_of_range
vector<int> F(10,2);
cout << F.at(6) << endl; // 2
================================
iterator begin()
返回一個可變迭代器
const_iterator begin() const
返回一個常量的迭代器,不可變
vector<int> A(10,2);
vector<int>::iterator it = A.begin(); //返回值是迭代器
================================
iterator end()
const_iterator end() const
返回的是越界後的第一個位置,也就是最後一個元素的下一個位置
vector<int> A(10,2);
vector<int>::iterator it = A.end(); //返回值是迭代器
================================
reverse_iterator rbegin()
const_reverse_iterator rbegin() const
反序的第一個元素,也就是正序最後一個元素
vector<int> A(10,2);
vector<int>::iterator it = rbegin(); //返回值是迭代器
================================
reverse_iterator rend()
const_reverse_iterator rend() const
反序的最後一個元素下一個位置,也相當於正序的第一個元素前一個位置
vector<int> A(10,2);
vector<int>::iterator it = rend(); //返回值是迭代器
================================
size_type size() const
返回容器中元素個數
vector<int> A(10,2);
A.size(); //10
================================
size_type max_size() const
返回容器的最大可以儲存的元素個數,這是個極限,當容器擴充套件到這個最大值時就不能再自動增大
vector<int> A;
A.max_size(); //很大
================================
void resize(size_type _Newsize, bool _Val = false)
重新分配容器的元素個數,這個還可以改容器的容量
vector<int> A(10,2);
A.resize(5); //重新分配
cout <<A.size()<<endl; //5
================================
bool empty() const
當元素個數為0時返回true,否則為false,根據的是元素個數而不是容器的儲存空間的大小
vector<int> A(10,2);
A.empty(); //return false
================================
size_type capacity() const
返回vector的實際儲存空間的大小,這個一般大於或等於vector元素個數,注意與size()函式的區別
vector<int> A(10,2);
A.resize(5); //重新分配
cout <<A.size()<<endl; //5
A.capacity(); //10
================================
void reserve(size_type _Count)
重新分配空間的大小,不過這個_Count值要比原來的capacity()返回的值大,不然儲存空間保持不變,_Count值要比原來的實際儲存空間大才能重新分配空間,但是最大值不可以大於max_size的值,否則會丟擲異常
vector<int> A(10,2);
A.capacity(); //10
A.resize(5); //重新分配
A.capacity(); //10
A.resize(20);
A.capacity(); //20
================================
reference front()
const_reference front() const
返回第一個元素的值,與begin()函式有區別,begin()函式返回的是第一個元素的迭代器
//A (1,2,3,4,5)
cout << A.front() << endl; // 1
================================
reference back()
const_reference back() const
同樣,返回最後一個元素的值,注意與end()函式的區別
//A (1,2,3,4,5)
cout << A.back() << endl; // 5
================================
void push_back(const _Ty& _Val)
在容器的最後一個位置插入元素x,如果size值大於capacity值,則將重新分配空間
//A (1,2,3,4,5)
A.push_back(6); // A (1,2,3,4,5,6 - - - - -)
================================
void pop_back()
刪除最後一個元素
//A (1,2,3,4,5)
A.pop_back(); // A (1,2,3,4,-)
================================
iterator insert(const_iterator _Where, const _Ty& _Val)
void insert(const_iterator _Where, size_type _Count, const _Ty& _Val)
void insert(const_iterator _Where, _Iter _First, _Iter _Last)
第一個函式,在迭代器指定的位置前插入值為_Val的元素
第二個函式,在迭代器指定的位置前插入_Count個值為_Val的元素
第三個函式,在迭代器指定的位置前插入另外一個容器的一段序列迭代器first到last,若插入新的元素後總得元素個數大於capacity,則重新分配空間
//A (1,2,3,4,5)
A.insert(A.begin()+1, 8); // A (1,8,2,3,4,5 ----)
A.insert(A.begin()+1, 2, 9); // A (1,9,9,8,2,3,4,5 --)
//B (6,5,7)
//C (1 1 1)
//[First, Last) 半開半閉區間
C.insert(C.begin(), B.begin(), B.begin()+2); // C (6 5 1 1 1)
================================
iterator erase(const_iterator _Where)
iterator erase(const_iterator _First_arg, const_iterator _Last_arg)
刪除元素或一段序列
//A (1,2,3,4,5)
A.erase(A.begin()); // A (2,3,4,5) 元素個數少了
// erase [_First, _Last)半開半閉區間
A.erase(A.begin(), A.begin()+2); //A (4,5) 又少了兩個
================================
void swap(_Vb_reference<_Alloc> _Left, _Vb_reference<_Alloc> _Right)
交換這兩個容器的內容,這涉及到儲存空間的重新分配
//A (1,2,3)
//B (4, 5)
A.swap(B); //儲存空間重新分配
================================
void clear()
將容器裡的內容清空,size值為0,但是儲存空間沒有改變
//A (1,2,3,4,5)
A.clear(); //
cout<< A.size()<<endl; //0
cout<<A.capacity()<<endl; //5