閱讀291 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 數據挖掘主要解決的四類問題
  下一篇:go IT巨頭血戰手機的背後:移動互聯入口之爭