標籤:style color 使用 os io strong 檔案 資料
目錄 [-]
說明
構造
方法
例子
vector 類中定義了4中種建構函式:
· 預設建構函式,構造一個初始長度為0的空向量,如:vector<int> v1; · 帶有單個整形參數的建構函式,此參數描述了向量的初始大小。
說明
vector是一種動態數組,是基本數組的類模板。其內部定義了很多基本操作。
#include <vector> 注意:標頭檔沒有“.h”
構造:
這個建構函式還有一個可選的參數,這是一個類型為T的執行個體,描述了各個向量種各成員的初始值;
如:vector<int> v2(init_size,0); 如果預先定義了:int init_size;他的成員值都被初始化為0;
· 複製建構函式,構造一個新的向量,作為已存在的向量的完全複製;
如:vector<int> v3(v2);
· 帶兩個常量參數的建構函式,產生初始值為一個區間的向量。區間由一個半開區間[first,last](MS word的顯示可能會有問題,first前是一個左方括弧,last後面是一個右圓括弧)來指定。
如:vector<int> v4(first,last) vector<int> v1;
vector<int> v2(init_size,0);
vector<int> v3(v2);
方法:
c.assign(beg,end) c.assign(n,elem) 將(beg; end)區間中的資料賦值給c。將n個elem的拷貝賦值給c。
c. at(idx) 傳回索引idx所指的資料,如果idx越界,拋出out_of_range。
c.back() 傳回最後一個資料,不檢查這個資料是否存在。
c.begin() 傳回迭代器中的第一個資料地址。
c.capacity() 返回容器中資料個數。
c.clear() 移除容器中所有資料。
c.empty() 判斷容器是否為空白。
c.end() // 指向迭代器中末端元素的下一個,指向一個不存在元素。
c.erase(pos) // 刪除pos位置的資料,傳回下一個資料的位置。
c.erase(beg,end) 刪除[beg,end)區間的資料,傳回下一個資料的位置。
c.front() 傳回第一個資料。
get_allocator 使用建構函式返回一個拷貝。
c.insert(pos,elem) // 在pos位置插入一個elem拷貝,傳回新資料位元置
c.insert(pos,n,elem) // 在pos位置插入n個elem資料,無傳回值
c.insert(pos,beg,end) // 在pos位置插入在[beg,end)區間的資料。無傳回值
c.max_size() 返回容器中最大資料的數量。
c.pop_back() 刪除最後一個資料。
c.push_back(elem) 在尾部加入一個資料。
c.rbegin() 傳回一個逆向隊列的第一個資料。
c.rend() 傳回一個逆向隊列的最後一個資料的下一個位置。
c.resize(num) 重新指定隊列的長度。
c.reserve() 保留適當的容量。
c.size() 返回容器中實際資料的個數。
c1.swap(c2) // 將c1和c2元素互換
例子:
為了協助理解向量的概念,這裡寫了一個小例子,其中用到了vector的成員函數:begin(),end(),push_back(),assign(),front(),back(),erase(),empty(),at(),size()。
//stl_cpp_8.cpp
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> INTVECTOR;//自訂類型INTVECTOR
//測試vector容器的功能
void main(void)
{
//vec1對象初始為空白
INTVECTOR vec1;
//vec2對象最初有10個值為6的元素
INTVECTOR vec2(10,6);
//vec3對象最初有3個值為6的元素,拷貝構造
INTVECTOR vec3(vec2.begin(),vec2.begin()+3);
//聲明一個名為i的雙向迭代器
INTVECTOR::iterator i;
//從前向後顯示vec1中的資料
cout<<"vec1.begin()--vec1.end():"<<endl;
for (i =vec1.begin(); i !=vec1.end(); ++i)
cout << *i << " ";
cout << endl;
//從前向後顯示vec2中的資料
cout<<"vec2.begin()--vec2.end():"<<endl;
for (i =vec2.begin(); i !=vec2.end(); ++i)
cout << *i << " ";
cout << endl;
//從前向後顯示vec3中的資料
cout<<"vec3.begin()--vec3.end():"<<endl;
for (i =vec3.begin(); i !=vec3.end(); ++i)
cout << *i << " ";
cout << endl;
//測試添加和插入成員函數,vector不支援從前插入
vec1.push_back(2);//從後面添加一個成員
vec1.push_back(4);
vec1.insert(vec1.begin()+1,5);//在vec1第一個的位置上插入成員5
//從vec1第一的位置開始插入vec3的所有成員
vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end());
cout<<"after push() and insert() now the vec1 is:" <<endl;
for (i =vec1.begin(); i !=vec1.end(); ++i)
cout << *i << " ";
cout << endl;
//測試賦值成員函數
vec2.assign(8,1); // 重新給vec2賦值,8個成員的初始值都為1
cout<<"vec2.assign(8,1):" <<endl;
for (i =vec2.begin(); i !=vec2.end(); ++i)
cout << *i << " ";
cout << endl;
//測試引用類函數
cout<<"vec1.front()="<<vec1.front()<<endl;//vec1第零個成員
cout<<"vec1.back()="<<vec1.back()<<endl;//vec1的最後一個成員
cout<<"vec1. at(4)="<<vec1. at(4)<<endl;//vec1的第五個成員
cout<<"vec1[4]="<<vec1[4]<<endl;
//測試移出和刪除 // 此時 vec1為: 2 6 6 6 5 4
vec1.pop_back();//將最後一個成員移出vec1 //此時 vec1: 2 6 6 6 5
vec1.erase(vec1.begin()+1,vec1.end()-2);//刪除成員-- //begin()+1 指的是從左至右的第一個6, end()-2指的是從右至左第1個6, erase的結果後 vec1成了 2,6,5
cout<<"vec1.pop_back() and vec1.erase():" <<endl;
for (i =vec1.begin(); i !=vec1.end(); ++i)
cout << *i << " ";
cout << endl;
//顯示序列的狀態資訊
cout<<"vec1.size(): "<<vec1.size()<<endl;//列印成員個數
cout<<"vec1.empty(): "<<vec1.empty()<<endl;//判斷vec1是否為空白,空則返回1,不空返回0
}
push_back()是將資料放入vector(向量)或deque(雙端隊列)的標準函數。Insert()是一個與之類似的函數,然而它在所有容器中都可以使用,但是用法更加複雜。end()實際上是取末尾加一,以便讓迴圈正確運行--它返回的指標指向最靠近數組界限的資料。