C++STLvector
一、構造函數
1)、vecto<T> v; //創建一個空的vector<T>對象,這個對象的元素的類型為T,T是需要指定的。
2)、vector<T> v(n); //創建一個vector<T>對象,v.size()為n, 每個元素的值都會是係統默認的值,如果T是類,就會是默認構造函數來初始化。
3)、vector<T> v(n, value);//跟第二個差不多,區別就是初始化不是默認值,而是用指定的value值來初始化這N個元素
4)、vector<T> v(iter1, iter2);//用迭代器來指定一個範圍內的元素來初始化。如:
vector<int> v;
for (int i = 1; i <= 10; i++)
v.push_back(i);
vector<int> v1(v.begin(), v.end());
二、常用的操作
v.push_back(value);//把value放到對象v的末尾
v.pop_back(); //把對象v的末尾的值刪除,並縮減其容量
v.capacity();//返回v的容量
v.max_size();//返回v最大可以存放的元素的個數
v.size();//返回v中元素的個數
v.empty();//如果v中元素個數為0,那麼就返回true,否則返回false
v.reserve(n, value);//設置v的容量為n,那麼原來如果為m, m < n, 則m-n這些元素都用value來初始化
v.front();//返回v的第一個元素
v.back();//返回v的最後一個元素
v1.swap(v2);//交換v1\v2的內容
v.clear();//清空所有元素,並將其容量變為0
v.begin();//返回指向第一個元素的迭代器
v.end();//返回指向最後一個元素之後的迭代器
v.rbegin();//返回指向最後一個元素的迭代器
v.rend();//返回指向第一個元素之前的迭代器
v.insert(iterator, value);//在迭代器iterator指向的元素之前插入value
v.insert(iterator, n, value);//在迭代器iterator指向的元素之前插入n個value
v.earse(iterator);//刪除迭代器iterator指向的元素刪除掉
v.earse(iteBegin, iteEnd);//刪除兩個迭代器指定的範圍內的元素
v[i] //像數組一樣來訪問元素,但是不會進行越界檢查,跟數組一樣不檢查的
v.at(i);//返回v中下標為i的元素。這個成員函數會起先越界檢查,如果越界會拋出out_of_range
如:
try
{
for (int i = 0; i <= v.size(); i++)
cout << v.at(i) << " ";
}
catch (out_of_range)
{
cout << "out of range" << endl;
}
//那麼這裏就是輸出out of range.
三、重載的運算符
1、 v1 = v2; //調用複製構造函數來完成賦值
2、v1 == v2; //按字典順序來比較,如果相等,返回true。下麵的幾個也一樣的道理
3、v1 < v2;
4、v1 > v2;
5、v1 != v2
四、迭代器部分
1、定義一個迭代器,有const的是用const限定的迭代器,不允許修改通過*來修改其值,
有reverse的是逆序迭代器
vector<int>::iterator it = v.begin(); //
vector<int>::const_iterator cit = v.begin();
vector<int>::reverse_iterator rit = v.rbegin();
vector<int>::const_reverse_iterator crit = v.rbegin();
這樣定義以後可以執行以下操作:
++it 、--it、*it、=、 == 、 !=、+、-、【】
順序輸出元素:
for (vector<int>::const_iterator cit = v.begin(); cit != v.end(); cit++)
cout << *cit << " ";
cout << endl;
逆序輸出元素:
for (vector<int>::const_reverse_iterator crit = v.rbegin(); crit != v.rend(); crit ++)
cout << *crit << " ";
cout << endl;
五、創建二維vector對象
1)、const int ROWS = 3, COLUMNS = 4;
vecotor< vecotr<double> > table(ROWS, vector<double> (COLUMNS, 0.0));
//創建了一個3*4的矩陣,其中的vector<double> (COLUMNS, 0.0);是創建一個臨時對象,其元素個數為COLUMNS, 每個元素值為0.0;
2)、單下標訪問
table[0];//這是第一行
3)、雙下標
table[0][0];//table 表中的第一行第一列對象的元素
4、size()方法
table.size();//返回的是行數
table[r].size();//返回的是列數
5、遍曆二維表
for (int row = 0; row < table.size(); row++)
for (int col = 0; col < table[row].size(); col++)
cout << table[row][col] << " ";
cout << endl;
6、使用push_back()成員函限乘
加入一行:table.push_back(vector<double> (COLUMNS, 0.0));
在每行末尾直接加一個元素:
for (int row = 0; row < table.size(); row++)
table[row].push_back(0.0);
創建不規則二維表
vecotor< vecotor<double> > table;
for (int col = 1; col <= 3; col++)
table.push_back(vector<double> (col, 0.0));
結果如圖:
0.0
0.0 0.0
0.0 0.0 0.0
六、常見的錯誤
1、vector<int> v;
for (int i = 0; i < 10; i++)
v[i] = i;
//知道錯在哪裏了嗎?因為v是一個空的對象,它的容量大小為0,這是不允許使用下標來賦值的。
//解決辦法有兩種:
第一種:使用push_back()成員函數,這個函數會自動擴展其容量以適應新的元素
第二種:使用reserve()成員函數來預留容量。
2、在使用迭代器的時候一定要注意,每次使用之後會有可能改變了指向,所以一定要注意,
最好在每次使用的都重新讓他指向你需要的地方。
最後更新:2017-04-02 15:14:47