vector的使用

最近一直想使用vector,於是就查了一些資料,這篇應該還是比較簡單清楚的,可以仔細看一下,而且還有vector構造函數和成員函數,最下面是實現代碼,可以複製運行,最好一個功能一個功能運行,加深理解。


vector是線性容器,它的元素嚴格的按照線性序列排序,和動態數組很相似,和數組一樣,它的元素存儲在一塊連續的存儲空間中,這也意味着我們不僅可以使用迭代器(iterator)訪問元素,還可以使用指針的偏移方式訪問,和常規數組不一樣的是,vector能夠自動存儲元素,可以自動增長或縮小存儲空間,

vector的優點:

1.       可以使用下標訪問個別的元素

2.       迭代器可以按照不同的方式遍歷容器

3.       可以在容器的末尾增加或刪除元素

和數組相比,雖然容器在自動處理容量的大小時會消耗更多的內存,但是容器能提供和數組一樣的性能,而且能很好的調整存儲空間大小

和其他標準的順序容器相比(deques or lists),能更有效訪問容器內的元素和在末尾添加和刪除元素,在其他位置添加和刪除元素,vector則不及其他順序容器,在迭代器和引用也不比lists支持的好

容器的大小和容器的容量是有區別的,大小是指元素的個數,容量是分配的內存大小,容量一般等於或大於容器的大小,vector::size()返回容器的大小,vector::capacity()返回容量值,容量多於容器大小的部分用於以防容器的增加使用,每次重新分配內存都會很影響程序的性能,所以一般分配的容量大於容器的大小,若要自己指定分配的容量的大小,則可以使用vector::reserve(),但是規定的值要大於size()值,

 

1.構造和複製構造函數

explicit vector ( const Allocator& = Allocator() );

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

template <class InputIterator>

vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );

vector ( const vector<T,Allocator>& x );

 

explicit:是防止隱式轉換, Allocator是一種內存分配模式,一般是使用默認的

 

vector<int> A;  //創建一個空的的容器

vector<int> B(10,100); //創建一個個元素,每個元素值爲

vector<int> C(B.begin(),B.end()); //使用迭代器,可以取部分元素創建一個新的容器

vector<int> D(C); //複製構造函數,創建一個完全一樣的容器

 

2.析構函數

 ~vector()

銷燬容器對象並回收了所有分配的內存

 

3.重載了=符號

vector<int> E;

E = B; //使用=符號

B = vector<int>(); //將B置爲空容器

 

 

4. vector::begin()  返回第一個元素的迭代器

  函數原型:

  iterator begin ();  //返回一個可變迭代器

const_iterator begin () const; //返回一個常量的迭代器,不可變

 

5.vector::end()  返回的是越界後的第一個位置,也就是最後一個元素的下一個位置

  iterator end ();

const_iterator end () const;

 

6.vector::rbegin() 反序的第一個元素,也就是正序最後一個元素

  reverse_iterator rbegin();

const_reverse_iterator rbegin() const;

 

7.vector::rend() 反序的最後一個元素下一個位置,也相當於正序的第一個元素前一個位置

  reverse_iterator rend();

const_reverse_iterator rend() const;

和vector::end()原理一樣

 

8.vector::size() 返回容器中元素個數

  size_type size() const;

  注意與vector::capacity()的區別

 

9.vector::max_size()

  size_type max_size () const;

  返回容器的最大可以存儲的元素個數,這是個極限,當容器擴展到這個最大值時就不能再自動增大

 

10. vector::resize()

  void resize ( size_type sz, T c = T() );

  重新分配容器的元素個數,這個還可以改容器的容量,如果重新分配的元素個數比原來的小,將截斷序列,後面的部分丟棄,如果大於原來的個數,後面的值是c的值,默認爲0

 

11. vector::capacity()

   size_type capacity () const;

   返回vector的實際存儲空間的大小,這個一般大於或等於vector元素個數,注意與size()函數的區別

 

12. vector::empty()

   bool empty () const;

   當元素個數爲0時返回true,否則爲false,根據的是元素個數而不是容器的存儲空間的大小

 

 

13. vector::reserve()

   void reserve ( size_type n );

重新分配空間的大小,不過這個n值要比原來的capacity()返回的值大,不然存儲空間保持不變,n值要比原來的實際存儲空間大才能重新分配空間,但是最大值不可以大於max_size的值,否則會拋出異常

 

14. vector::operator[]  //重載了[]符號

   reference  operator[] ( size_type n );

const_reference  operator[] ( size_type n ) const;

實現了下標訪問元素

 

15. vector::at()

   const_reference at ( size_type n ) const;

   reference at ( size_type n );

   在函數的操作方面和下標訪問元素一樣,不同的是當這個函數越界時會拋出一個異常out_of_range

 

16. vector::front()

   reference front ( );

const_reference front ( ) const;

返回第一個元素的值,與begin()函數有區別,begin()函數返回的是第一個元素的迭代器

 

17. vector::back()

   reference back ( );

const_reference back ( ) const;

同樣,返回最後一個元素的值,注意與end()函數的區別

 

18. vector::assign()

   template <class InputIterator> void assign ( InputIterator first, InputIterator last );

void assign ( size_type n, const T& u );

將丟棄原來的元素然後重新分配元素,第一個函數是使用迭代器,第二個函數是使用n個元素,每個元素的值爲u。

 

19. vector::push_back()

   void push_back ( const T& x );

   在容器的最後一個位置插入元素x,如果size值大於capacity值,則將重新分配空間

 

20. vector::pop_back()

   void pop_back ( );

   刪除最後一個元素

 

 

21. vector::insert()

   iterator insert ( iterator position, const T& x );

   void insert ( iterator position, size_type n, const T& x );

template <class InputIterator>

void insert ( iterator position, InputIterator first, InputIterator last );

   插入新的元素,

第一個函數,在迭代器指定的位置前插入值爲x的元素

第二個函數,在迭代器指定的位置前插入n個值爲x的元素

第三個函數,在迭代器指定的位置前插入另外一個容器的一段序列迭代器first到last

若插入新的元素後總得元素個數大於capacity,則重新分配空間

 

22. vector::erase()

   iterator erase ( iterator position );

iterator erase ( iterator first, iterator last );

刪除元素或一段序列

 

23. vector::swap()

   void swap ( vector<T,Allocator>& vec );

   交換這兩個容器的內容,這涉及到存儲空間的重新分配

 

24. vector::clear()

   void clear ( );

   將容器裏的內容清空,size值爲0,但是存儲空間沒有改變

 下面是代碼的實現,建議先註釋後面,一句一句實現下,你會發現很簡單,加深理解,下次就會用了

#include<vector>
#include<iostream>

using namespace std;


int main()
{
    vector<int> vec(2,3);
    vector<int>::iterator iter;
    vector<int>::iterator begin=vec.begin();
    vector<int>::iterator end=vec.end();
    cout<<"vec:";
    for(iter=vec.begin(); iter!=vec.end(); iter++)
    {
       // static std::size_t i=0;
        cout<<*iter<<",";
       // i++;
    }
    cout<<endl;
    cout<<"size:"<<vec.size()<<endl;
    cout<<"capacity:"<<vec.capacity()<<endl;
//////////////////////////////////////////////////
    cout<<endl;
    for(int i=0;i<8;i++)
    vec.push_back(i);
//    vec.push_back(2);

    begin=vec.begin();
    end=vec.end();
    cout<<"push back 1 and 2 based on above;vec:";
    for(iter=begin; iter!=end; iter++)
    {
        static std::size_t j=0;
        cout<<*iter<<",";
        j++;
    }
    cout<<endl;
    cout<<"size:"<<vec.size()<<endl;
    cout<<"capacity:"<<vec.capacity()<<endl;

    vector<int>:: reverse_iterator  reiter=vec.rbegin();
    cout<<*reiter<<endl;
    vector<int>::size_type mx=vec.max_size();
    cout<<mx<<endl;
    vec.resize(4);
    vec.reserve(30);
     for(iter=vec.begin(); iter!=vec.end(); iter++)
    {
        static std::size_t j=0;
        cout<<*iter<<",";
        j++;
    }
    cout<<endl;
    cout<<"size:"<<vec.size()<<endl;
    cout<<"capacity:"<<vec.capacity()<<endl;
////////////////////////////
    vector<int> f(8,3);
    vec.assign(f.begin()+1,f.end());
    for(iter=vec.begin(); iter!=vec.end(); iter++)
    {
        static std::size_t j=0;
        cout<<*iter<<",";
        j++;
    }
    cout<<endl;
    cout<<"size:"<<vec.size()<<endl;
    cout<<"capacity:"<<vec.capacity()<<endl;

//
    vec.insert(vec.begin()+3,3,9);
    for(iter=vec.begin(); iter!=vec.end(); iter++)
    {

        cout<<*iter<<",";
    }
    cout<<endl;
    cout<<"size:"<<vec.size()<<endl;
    cout<<"capacity:"<<vec.capacity()<<endl;

    vec.insert(vec.begin()+4,f.begin()+7,f.end());
    for(iter=vec.begin(); iter!=vec.end(); iter++)
    {

        cout<<*iter<<",";
    }
    cout<<endl;
    cout<<"size:"<<vec.size()<<endl;
    cout<<"capacity:"<<vec.capacity()<<endl;

    //////////////////////////////////////////////////
    cout<<endl;
    cout<<"call clear(),based on the above:"<<endl;
    vec.clear();
    begin=vec.begin();
    end=vec.end();
    cout<<"     size:"<<vec.size()<<endl;
    cout<<"     capacity:"<<vec.capacity()<<endl;
    cout<<"vec:";
    for(iter=begin; iter!=end; iter++)
    {
        static std::size_t m=0;
        cout<<*iter<<",";
        m++;
    }
    cout<<endl;
/*/////////////////////////////////////////////////
    cout<<endl;
  //  for(int i=8;i>=0;i--)
        vec.pop_back();

   // begin=vec.begin();
   // end=vec.end();
    cout<<"pop one element based on above;vec:";
    for(iter=begin; iter!=vec.end(); iter++)
    {
        static std::size_t k=0;
        cout<<*iter<<",";
        k++;
    }
    cout<<endl;
    cout<<"size:"<<vec.size()<<endl;
    cout<<"capacity:"<<vec.capacity()<<endl;
/////////////////////////////////////////////////
    begin=vec.begin();
    end=vec.end();
    cout<<endl;
    if(vec.empty())
    {
        cout<<"vec is empty"<<endl;
    }
    else
    {
        cout<<"vec is not empty"<<endl;
    }
/////////////////////////////////////////////////
    cout<<endl;
    cout<<"based on the above:"<<endl;
    cout<<"     vec.front():"<<vec.front()<<endl;
    cout<<"     vec.back():"<<vec.back()<<endl;
    begin=vec.begin();
    end=vec.end();
    cout<<"     size:"<<vec.size()<<endl;
    cout<<"     capacity:"<<vec.capacity()<<endl;
    cout<<"vec:";
    for(iter=begin; iter!=end; iter++)
    {
        static std::size_t l=0;
        cout<<*iter<<",";
        l++;
    }
    cout<<endl;
////////////////////////////////////////////////////
    cout<<endl;
    cout<<"call at(),based on the above:"<<endl;
    cout<<"     vec.at():"<<vec.at(3)<<endl;
    begin=vec.begin();
    end=vec.end();
    cout<<"     size:"<<vec.size()<<endl;
    cout<<"     capacity:"<<vec.capacity()<<endl;
    cout<<"vec:";
    for(iter=begin; iter!=end; iter++)
    {
        static std::size_t m=0;
        cout<<*iter<<",";
        m++;
    }
    cout<<endl;

//////////////////////////////////////////////////
    cout<<endl;
    for(int i=1;i<8;i++)
    {
        vec.push_back(i);
    }
    cout<<"push_back 1,2,3,4,5,6,7 based on above;vec:";
    begin=vec.begin();
    end=vec.end();
    for(iter=begin; iter!=end; iter++)
    {
        static std::size_t m=0;
        cout<<*iter<<",";
        m++;
    }
////////////////////////////
    cout<<endl;
    vec.erase(vec.begin()+2);
    cout<<"call vec.erase(3),vec:";
    begin=vec.begin();
    end=vec.end();
    for(iter=begin; iter!=end; iter++)
    {
        static std::size_t m=0;
        cout<<*iter<<",";
        m++;
    }
    cout<<endl;
    cout<<"     size:"<<vec.size()<<endl;
    cout<<"     capacity:"<<vec.capacity()<<endl;
/////////////////////////
    cout<<endl;
    vec.erase(vec.begin()+1,vec.begin()+3);
    cout<<"call vec.erase(1,3),vec:";
    begin=vec.begin();
    end=vec.end();
    end--;
    cout<<*end<<endl;
    for(iter=begin; iter!=end; iter++)
    {
        static std::size_t m=0;
        cout<<*iter<<",";
        m++;
    }
    cout<<endl;
    cout<<"     size:"<<vec.size()<<endl;
    cout<<"     capacity:"<<vec.capacity()<<endl;
    return 1;/
*/
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章