1. 程式人生 > >【c++】容器vector

【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