天天看點

C++STLvector一、構造函數二、常用的操作四、疊代器部分五、建立二維vector對象六、常見的錯誤

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 << " ";

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] << "  ";

6、使用push_back()成員函限乘

加入一行:table.push_back(vector<double> (columns, 0.0));

在每行末尾直接加一個元素:

      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、在使用疊代器的時候一定要注意,每次使用之後會有可能改變了指向,是以一定要注意,

最好在每次使用的都重新讓他指向你需要的地方。