zoukankan      html  css  js  c++  java
  • 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 _tmain(int argc, _TCHAR* argv[])
    {
    
            //构造函数,复制构造函数(元素类型要一致),
    	vector<int> A;  //创建一个空的的容器
    	vector<int> B(10,100); //创建一个10个元素,每一个元素值为100
    	vector<int> C(B.begin(),B.end()); //使用迭代器,能够取部分元素创建一个新的容器
    	vector<int> D(C); //复制构造函数,创建一个全然一样的容器
        
              //重载=
    	vector<int> E;
    	E = B;
     
    	//vector::begin(),返回的是迭代器
       
    	vector<int> F(10); //创建一个有10个元素的容器
               for (int i = 0; i < 10; i++)
              {
    		F[i] = i;
              }
    
    	/*
    	vector<int> F; //创建一个空容器
    	for (int i = 0; i < 10; i++)
    	{
    		F.push_back(i);
    	} 
            */
    
    	vector<int>::iterator BeginIter = F.begin();
    	cout << *BeginIter << endl; //输出0
    
    	//vector::end() 返回迭代器
    	vector<int>::iterator EndIter = F.end();
    	EndIter--; //向后移一个位置
    	cout << *EndIter << endl; //输出9
     
    	//vector::rbegin() 返回倒序的第一个元素,相当于最后一个元素
    	vector<int>::reverse_iterator ReverBeIter = F.rbegin();
    	cout << *ReverBeIter << endl; //输出9
    
    	//vector::rend() 反序的最后一个元素下一个位置,也相当于正序的第一个元素前一个位置
    	vector<int>::reverse_iterator ReverEnIter = F.rend();
    	ReverEnIter--;
    	cout << *ReverEnIter << endl; //输出0
    
    	//vector::size() 返回元素的个数
    	cout << F.size() << endl; //输出10
    
    	//vector::max_size()
    	cout << F.max_size() << endl; //输出1073741823,这个是极限元素个数
    
    	//vector::resize()
    	cout << F.size() << endl; //输出10
    	F.resize(5);
    	for(int k = 0; k < F.size(); k++)
    		cout << F[k] << "  "; //输出 0 1 2 3 4
             cout << endl;
    	
    	//vector::capacity()
    	cout << F.size() << endl; //5
    	cout << F.capacity() << endl; //10
    
    	//vector::empty()
             B.resize(0);
    	cout << B.size() << endl; //0
    	cout << B.capacity() << endl; //10
    	cout << B.empty() << endl; //true
    
    	//vector::reserve() //又一次分配存储空间大小
               cout << C.capacity() << endl; //10
    	C.reserve(4);
    	cout << C.capacity() << endl; //10
    	C.reserve(14);
    	cout << C.capacity() << endl; //14
    
    	//vector::operator []
    	cout << F[0] << endl; //第一个元素是0
    
    	//vector::at()
    	try
    	{
    	  cout << "F.size = " << F.size() << endl; //5
               cout << F.at(6) << endl; //抛出异常
    	}
    	catch(out_of_range)
    	{	
    	   cout << "at()訪问越界" << endl;
    	}
    
    	//vector::front() 返回第一个元素的值
               cout << F.front() << endl; //0
    
    	//vector::back()
    	cout << F.back() << endl; //4
    
    	//vector::assign()
    	cout << A.size() << endl; //0
    	vector<int>::iterator First = C.begin();
    	vector<int>::iterator End = C.end()-2;
    	A.assign(First,End);
    	cout << A.size() << endl; //8
    	cout << A.capacity() << endl; //8
    
    	A.assign(5,3); //将丢弃原来的全部元素然后又一次赋值
    	cout << A.size() << endl; //5
    	cout << A.capacity() << endl; //8
    
    	//vector::push_back()
    	cout << *(F.end()-1) << endl; //4
    	F.push_back(100);
    	cout << *(F.end()-1) << endl; //100
    
    	//vector::pop_back()
    	cout << *(F.end()-1) << endl; //100
    	F.pop_back();
    	cout << *(F.end()-1) << endl; //4
    
    	//vector::swap()
    	F.swap(D); //交换这两个容器的内容
    	for(int f = 0; f < F.size(); f++)
    		cout << F[f] << " ";
    	cout << endl;
    	for (int d = 0; d < D.size(); d++)
    	    cout << D[d] << " ";
             cout << endl;
    	//vector::clear()
    	F.clear();
    	cout << F.size() << endl;     //0
    	cout << F.capacity() << endl; //10
    
    	return 0;
    }
    
    

    有个英文版的解析的链接

    http://www.cplusplus.com/reference/stl/


     

  • 相关阅读:
    第4月第1天 makefile automake
    第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash
    第3月第27天 uitableviewcell复用
    learning uboot fstype command
    learning uboot part command
    linux command dialog
    linux command curl and sha256sum implement download verification package
    learning shell script prompt to run with superuser privileges (4)
    learning shell get script absolute path (3)
    learning shell args handing key=value example (2)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4281565.html
Copyright © 2011-2022 走看看