STL_Vector

/***************************************
*Vector總結
*vector模塑出一個動態數組,所以,它自己是「將元素至於動態數組中加以管理」
*的一個抽象的概念。
*
*1.使用前須要包含頭文件<vector>
*2.Vector將其元素複製到內部的dynamic array中。
   元素之間老是存在某種順序,因此vector是一種有序羣集(ordered collec)。 
   vector支持隨機存取,所以只要知道位置,你能夠在常數時間內存取任何一個元素。
   vector的迭代器是隨機存取迭代器,因此對任何一個STL算法均可以奏效。

*我的理解:vector是在末端插入 或者 刪除元素,能夠說至關於一個棧吧。

*vector中用於操做大小的函數

  size();
  empty();
  max_size();
  capacity();(返回vector實際能容納的元素數量,若是超過這個數量,vector就有必要從新配置內部存儲器)
  

  A.一旦內存從新配置,和vector元素相關的全部reference、pointers、iterators都會失效
  B.內存從新配置很耗時間

  因此若是你的程序管理了和vector元素相關的reference、pointers、iterators,
  或者若是執行速度對你而言相當重要,那麼就必須考慮容量問題。

*避免從新配置內存的方法

  能夠用 reserve()保留適當的容量

  std::vector<int> v;
  v.reserve(80);
  另外一種避免從新配置內存的方法是,初始化期間就向構造函數傳遞附加參數,構造出足夠的空間,
  若是是ACM的話,通常是這樣用的。
  std::vector<T> v(5);

  vector不能使用reserve()來所見容量,這一點於string不一樣。


*構造,拷貝和解構

  vector<Elem> c            產生一個空vector,其中沒有任何元素
  vector<Elem> c1(c2)        產生另外一個同型vector的副本(全部元素都被拷貝)
  vector<Elem> c(n)            利用元素的default構造函數生成一個大小爲n的vector
  vector<Elem> c(n,elem)    產生一個大小爲n的vector,每一個元素值都是elem
  vector<Elem> c(beg,end)    產生一個vector,以區間[beg;end]做爲元素初值
  c.~vector<Elem>()            銷燬全部元素,並釋放內存

*非變更性操做(Nonmodifying Operation)

  c.size();
  c.empty()
  c,max_size();
  capacity();
  reserve();    //並不是徹底意義上的非變更

  c1 == c2;
  c1 != c2
  c1 < c2;
  c1 > c2;
  c1 <= c2;
  c1 >= c2;


*賦值(Assignments)

  c1 = c2                    將c2的所有元素賦值給c1
  c.assign(n,elem)            複製n個elem,賦值給c
  c.assign(beg,end)
  c1.swap(c2)
  swap(c1,c2)

*元素存取(Element Access)

  c.at(idx)                    返回索引idx所標識的元素。若是idx越界拋出out_of_range
  c[idx]                    返回索引idx所表示的元素,不進行範圍檢查
  //我的以爲就是把vector看成一個數組來用了
  c.front()                    返回第一個元素,不檢查第一個元素是否存在
  c.back()                    返回最後一個元素,不檢查最後一個元素是否存在

  //對於調用者來講,最重要的事情莫過於搞清楚這些操做是否進行範圍檢查。
  //只有at()會這麼作
  //對一個vector調用operation[],front(),back(),都會引起未定義行爲。

*迭代器相關函數(Iterator Function)

  vector提供了一些常規函數來獲取迭代器。(一般就是一個指針)

  c.begin();                返回一個隨機存取迭代器,指向第一個元素
  c.end();                    返回一個隨機存儲迭代器,指向最後一個元素的一下個位置
  c.rbegin();                返回一個逆向迭代器,指向逆向迭代的第一個元素
  c.rend();

*安插(insert) 和 移除(remove)元素

  c.insert(pos,elem)        在pos位置上插入一個elem副本,並返回元素位置
  c.insert(pos,n,elem)        在pos位置上插入n個elem副本。無回傳值
  c.insert(pos,beg,end)        在pos位置上插入區間[beg;end]內的全部元素的副本,無回傳值
  
  c.push_back(elem)            在尾部添加一個elem副本
  c.pop_back()                移除最後一個元素(但不回傳)
  c.erase(pos)                移除pos位置上的元素,返回下一個元素的位置    
  c.erase(beg,end)

  c.resize(num)                將元素數量改成num(若是size()變大了,多出來的新元素都以default構造函數來完成)
  c.resize(num,elem)        

  c.clear()                    移除全部元素,將容器清空


*將Vector看成通常Arrays使用


  std::vector<char> v;
  v.resize(41);
  strcpy(&v[0],"hello, world!");
  printf("%s\n",&v[0]);


  //千萬不要把迭代器看成第一元素的地址來傳遞。vector迭代器是由實做版本定義的,也許並非一個通常指針
  //固然通常狀況下是。。。

  printf("%s\n",&v[0]);//OK
  printf("%s\n",v.begin());//ERROR



*異常處理(Exception Handling)



****************************************************************/


/*********************************
        Vector實例
*********************************/
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;




void Print_Element(vector <string> Object);

vector<string>::iterator Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp);

void main()
{
    vector <string> Object;

    Object.reserve(5);

    Object.push_back("Hello, ");
    Object.push_back("How");
    Object.push_back("are");
    Object.push_back("you");
    Object.push_back("?");



//     copy(Object.begin(),Object.end,
//         ostream_iterator<string>(cout," "));
    Print_Element(Object);


    cout<<Object.max_size()<<endl;

    cout<<Object.size()<<endl;
    cout<<Object.capacity()<<endl;


    swap(Object[1],Object[3]);



    //Print_Element(Object);


//    Object.insert(find(Object.begin(),Object.end(),"?"),"always");


    if (Find(Object.begin(),Object.end(),"?")!=NULL)   
        //若是查找成功 我返回一個迭代器 不然返回NULL
    {
        Object.insert(Find(Object.begin(),Object.end(),"?"),"always");
    }

//    Object.insert(Find(Object.begin(),Object.end(),"?")!=NULL,"always");


    
    Print_Element(Object);

    Object.back() = "!";  //更改最後一個string
    Print_Element(Object);


    Object.front() = "xxx";

    Print_Element(Object);


    cout<<Object.max_size()<<endl;
    
    cout<<Object.size()<<endl;
    cout<<Object.capacity()<<endl;
    //容量不足時,擴充一倍
    


}

vector<string>::iterator 
Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp)
{

    vector<string>::iterator pos;

    pos = Begin;

    for (pos;pos!=End;pos++)
    {
        if (pos->compare(szTemp)==0)
        {
            return pos;
        }
    }


    return NULL;


}


void Print_Element(vector <string> Object)
{
    vector <string>::iterator it;

    it = Object.begin();
    for (;it!=Object.end();it++)
    {
    //    cout<<*it<<endl;


        cout<<it->data()<<" ";
    }

    cout<<endl;
}

 

/***********************************************************************
        實例2
***********************************************************************/
#include<iostream>
#include<vector>

using namespace std;

void Print_Element(vector<int> Object);

int main()
{

    int i = 0;
    vector <int> Object(5,2);

    cout<<"Object.size(): "<<Object.size()<<endl;

    cout<<"Object.capacity(): "<<Object.capacity()<<endl;

    cout<<"Object.max_size(): "<<Object.max_size()<<endl;

    Object.reserve(10);

    cout<<"After reserve(10)"<<endl<<endl;
    cout<<"Object.size(): "<<Object.size()<<endl;

    cout<<"Object.capacity(): "<<Object.capacity()<<endl;

    cout<<"Push Data:"<<endl;
    for(i=0;i<5;i++)
    {
        Object.push_back(i);
    }

    Print_Element(Object);
    cout<<"Object.size(): "<<Object.size()<<endl;

    cout<<"Object.capacity(): "<<Object.capacity()<<endl<<endl;

    swap(Object[0],Object[8]);

    cout<<"After swap(Object[0],Object[8]) :"<<endl;
    
    Print_Element(Object);

    for(i=0;i<5;i++)
    {
        Object.pop_back();
    }

    cout<<"After Pop Data :"<<endl<<endl;
    Print_Element(Object);


    int front = Object.front();
    int back = Object.back();
    cout<<"front:"<<front<<endl;
    cout<<"back:"<<back<<endl<<endl;

    cout<<"After Object.assign(3,10): "<<endl;
    Object.assign(3,10);
    Print_Element(Object);


    vector <int> One(Object);
    cout<<endl<<"After vector <int> One(Object): "<<endl;

    Print_Element(One);

    cout<<endl<<"cout<<Object[0]: "<<ends<<Object[0]<<endl<<endl;

    Object.resize(10,100);

    cout<<"After Object.resize(10,100): "<<endl;
    Print_Element(Object);

 

    vector <int>::iterator pos;
    pos = Object.begin();

    cout<<"After Object.insert(pos,99): "<<endl;
    Object.insert(pos,99);
    Print_Element(Object);
    
    cout<<endl<<"Object.size(): "<<Object.size()<<endl;

    cout<<"Object.capacity(): "<<Object.capacity()<<endl;


    //這裏因爲插入了一個新的元素,因此vector的容量不夠用了,
    //進而致使了vector從新配置內存,
    //因此iterator失效了,不加上下面的    pos = Object.begin(),程序會奔潰的
    //

    pos = Object.begin();        //必須有這句,至關於手動重置pos

    Object.erase(pos);
    cout<<endl<<"After Object.erase(pos): "<<endl;
    Print_Element(Object);





    return 0;
}



void Print_Element(vector<int> Object)
{
    vector<int>::iterator it;

    it = Object.begin();

    for(;it<Object.end();it++)
    {
        cout<<*it<<ends;
    }
    cout<<endl;
}

相關文章
相關標籤/搜索