vector與iterator的一些用法


  使用vector,要添加其頭文件#include<vector>。

  1.vector的初始化及賦值,比如:

  std::vector<int> nVec;     // 空對象

  std::vector<int> nVec(5,-1);  // 創建了一個包含5個元素且值為-1的vector

  std::vector<std::string> strVec{"a", "b", "c"};  // 列表初始化   

  要注意“()”和“{}”這樣的初始化情況,比如:

  std::vector<int> nVec(10,1);    // 包含10個元素,且值為1 

  std::vector<int> nVec{10,1};    // 包含2個元素,值分別為10,1

 

  然而,一般在程序中,並不會知道vector的元素個數,故使用以上方式倒顯得繁瑣,所以可以使用push_back,它會負責將一個值當成vector對象的尾元素“壓到(push)”vector對象的“尾端(back)”。比如:

  std::vector<int> nVec;

  for(int i = 0; i < 5; ++i)

    nVec.push_back(i);    // 壓入元素

  for(size_t i = 0; i < nVec.size(); ++i)

    std::cout << nVec[i] << std::endl;    // 輸出元素

 

  其中size()是獲取vector元素的個數,另外vector中可使用empty()來返回vector中是否存在元素,如果為空,則返回true,否則返回false。同時,針對nVec[i]是通過下標運算符來獲取對應的vector數值的,千萬注意,針對於空的vector,萬不可通過下標運算符來添加元素,比如:

  std::vector<int> nVec;

  for(int i = 0; i < 5; ++i)

    nVec[i] = i;    // error

  這樣編寫代碼是錯誤的,nVec是空的,不包含任何對象。當然也就不可能通過下標來添加或訪問任何元素。若要添加請使用push_back。

  當然,針對於輸出,可使用迭代器iterator來表示,比如上面的例子可寫成:

  std::vector<int>::iterator itr = nVec.begin();

  for(; itr != nVec.end(); ++itr)

    std::cout << (*itr)  << std::endl;

  針對於iterator有兩種標准庫類型: iterator 和 const_iterator。

  兩者的區別主要是后者類似於常量指針,只能讀取不能修改。如果vector對象不是常量,兩者均可使用。

  2.插入元素

  deque像vector一樣提供了隨機訪問元素的能力,但deque支持push_front,且保證在容器首尾進行插入和刪除元素的操作只花常數時間。

  使用insert可在容器的任意位置插入0個或多個元素,vector,deque,list和string都支持insert成員。一般insert函數將元素插入到迭代器所指定的位置之前,比如:

  slist.insert(iter,"hello");      // 將Hello添加到iter之前的位置

  要注意,將元素插入到vector,deque和string中的任何位置都是合法的,但是這樣做會很耗時。

  c.insert(pos,num);    // 在pos位置插入元素num

  c.insert(pos,n,num);   // 在pos位置插入n個元素num

  c.insert(pos,beg,end);  // 在pos位置插入區間為[beg,end)的元素

 

  3.刪除元素

  針對於非array容器有多種刪除方式,以erase為例,比如:

  c.erase(p);      // 刪除迭代器p所指定的元素,返回一個指向被刪除元素之后的迭代器。

  c.erase(begin,end);   // 刪除b,e所指定范圍內的元素,返回一個指向被刪除元素之后的迭代器。

  c.clear();       // 刪除所有元素

  注意,刪除元素,會導致迭代器無效。故下面的編寫方式是錯誤的,比如:

  std::vector<int> nVec;
  for(int i = 0; i < 5; ++i)
    nVec.push_back(i);

  std::vector<int>::iterator iter = nVec.begin();
  for(; iter != nVec.end(); ++iter)
  {

    if(*iter == 1)
      nVec.erase(iter);
  }

  正確的方式是(刪除特定元素):

  std::vector<int>::iterator iter = nVec.begin();
  for(; iter != nVec.end();)
  {
    if(*iter == 0)
      iter = nVec.erase(iter);
    else
      iter++;
  }

  刪除容器內某一個特定的元素,編寫方式可為:

  std::vector<int>::iterator iter = std::find(nVec.begin(),nVec.end(),5);

  if(iter != nVec.end())
    nVec.erase(iter);

  刪除容器內某一段范圍內的元素,編寫方式可為:

  first = std::find(nVec.begin(),nVec.end(), value1);
  last = std::find(nVec.begin(),nVec.end(), value2);
  if(first != nVec.end() && last != nVec.end())    // 判斷有效性
  {
    nVec.erase(first,last);
  }

  針對於std::find函數的使用,要包含頭文件:#include <algorithm>

  刪除容器內所有元素,當然可以這樣:

  nVec.erase(nVec.begin(),nVec.end());

  不過,偶經常習慣於: nVec.clear();

  

  4. vector的容量與大小:

  vector並非隨着每個元素的插入而增長自己,它總是分配一些額外的內存容量,這種策略使得vector的效率更高些。若要獲取當前vector的大小,可調用size()函數,而獲取當前vector的容量,可調用capcity()。

  注意,list不需要容量,是由於它的每次增長,只是簡單的鏈接新元素而已。

 

  

  

  

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM