zoukankan      html  css  js  c++  java
  • C++标准库之vector(各函数及其使用全)

    原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5280566.html

    iterator类型:

    iterator:到value_type的访问,value_type是模板的类型

    const_iterator:到const value_type的访问

    reverse_iterator:reverse_iterator<iterator>

    const_reverse_iterator:reverse_iterator<const_iterator>

    其中我们常用的是iterator。

    函数:

    一、构造、赋值相关函数:

    1.构造函数

    explicit vector (const allocator_type& alloc = allocator_type());
    
    默认构造函数,空容器
    explicit vector (size_type n);
             vector (size_type n, const value_type& val,
                     const allocator_type& alloc = allocator_type());
    
    用n个val填充容器,含一个参数的是C++11定义的
    template <class InputIterator>
      vector (InputIterator first, InputIterator last,
              const allocator_type& alloc = allocator_type());
    
    范围构造,[first,last)这么多个,并且填充
    vector (const vector& x);
    vector (const vector& x, const allocator_type& alloc);
    
    拷贝构造,两个参数的是C++11
    vector (vector&& x);
    vector (vector&& x, const allocator_type& alloc);
    
    C++11
    vector (initializer_list<value_type> il,
           const allocator_type& alloc = allocator_type());
    C++11

    如:

      std::vector<int> first;                                // empty vector of ints
      std::vector<int> second (4,100);                       // four ints with value 100
      std::vector<int> third (second.begin(),second.end());  // iterating through second
      std::vector<int> fourth (third);

    2.=操作:vector& operator= (const vector& x);

    可以将一个vector通过=符号赋给另一个vector

      std::vector<int> foo (3,0);
      std::vector<int> bar (5,0);
    
      bar = foo;
      foo = std::vector<int>();
    
      std::cout << "Size of foo: " << int(foo.size()) << '
    ';
      std::cout << "Size of bar: " << int(bar.size()) << '
    ';

    输出为:

    Size of foo: 0
    Size of bar: 3

    二、Iterator操作相关函数:

    1.begin:iterator begin();

                 const_iterator begin() const;

    返回指向第一个元素的iterator指针

    2.end:用法与begin同,通常是一起使用来遍历容器中的元素

    返回指向最后一个元素再后面一个的iterator指针

    3.rbegin:reverse_iterator rbegin();

                  const_reverse_iterator rbegin() const;

    返回指向最后一个元素的reverse_iterator指针

    4.rend:用法与rbegin相同

    返回指向第一个元素前面一个元素的reverse_iterator指针,通常与rbegin一起使用来反向遍历容器

    5.cbegin、cend返回值类型为const_iterator,功能同begin、end

    6.crbegin、crend返回值类型为const_reverse_iterator,功能同crbegin、crend

    常用来遍历表,例如:

    vector<int>::iterator Iter;

    vector<int> c;

    for(Iter=c.begin();Iter!=c.end();Iter++)

    {}

    三、capacity相关函数

    1.size:size_type size() const;

    容器中元素个数。c.size();

    2.max_size():size_type max_size() const;

    返回最大容量。c.maxsize();

    3.resize:void resize (size_type n, value_type val = value_type());

    改变容器可以容纳元素的个数为n。如果n小于当前的容器大小,则保留前面n个元素,移除后面的。如果n大于当前容器大小,就扩展容器。value是初始值,如果n大于当前容器大小,则新增加的元素的值为value,若value省略,会自动调用一个默认值。

    std::vector<int> c;

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

         c.push_back(i);

    c.resize(5);

    c.resize(8,10);

    c.resize(12);

    for(int i=0;i<c.size();i++)

        std::cout<<c[i]<<"  ";

    结果为:1  2  3  4  5  10  10  10  0  0  0  0

    4.capacity:size_type capacity() const;

    当前分配给容器的存储空间大小(元素个数),这并不限制容器的扩展,理论限制容器扩展大小是max_size的值

    5.empty:bool empty() const;

    返回容器是否为空while(!c.empty()){sum+=c.back();
    c.pop_back();}

    6.reserve:void reserve (size_type n);

    使得capacity至少能容纳n个元素。

    7.shrink_to_fit(C++11):void shrink_to_fit();

    减小capacity,使其与容器大小相同

    四、元素访问相关函数

    1.[ ]操作:获取特定位置的元素。c[i];

    2.at:reference at (size_type n);

           const_reference at (size_type n) const;

    返回位置n处的元素。c.at(i),与c[i]差不多

    3.front:reference front();

                   const_reference front() const;

    返回容器中的第一个元素。c.front();

    4.back:reference back()

            const_reference back() const;

    返回容器中最后一个元素。c.back();

    5.data(C++11):value_type* data() noexcept;

               const value_type* data() const noexcept;

    返回一个指向容器中数组的指针c.data()

    int *p=c.data();

    *p=10;

    ++p;

    *p=20;

    p[2]=100;

    则c中存储的前面三个数据为10、20、100

    五、更新操作

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

                   void assign (size_type n, const value_type& val);

                   void assign (initializer_list<value_type> il);(C++11)

      给容器分配新的内容,并替换当前内容,同时修改大小,val为初始值

    std::vector<int>first;

    std::vector<int>second;

    std::vector<int>third;

    first.assign(7,100);

    std::vector<int>::iterator it;

    it=first.begin()+1;

    second.assign(it,first.end()-1);

    int myints[]={1776,7,4};

    third.assign(myints,myints+3);

    std::cout<<int(first.size())<<"  "<<int (second.size())<<"  "<<int (third.size())<<endl;

    结果为:7  5  3

    2.push_back: void push_back (const value_type& val);

    在容器最后增加一个新的元素。c.push_back(n)

    3.pop_back:void pop_back();

    移除最后一个元素。c.pop_back()

    4.insert:iterator insert(iterator position,const value_type& val):在position处插入元素val

                 void insert(iterator position,size_type n,const value_type& val):在position处插入n个元素,插入的元素值初始化为val

                 void insert(iterator position,InputIterator first,InputIterator last):在position处插入数组中从first到last的元素

    vector<int> c(3,100);

    vector<int>::iterator it;

    it=c.begin();

    it=c.insert(it,200);

    c.insert(it,2,300);

    it=c.begin();

    vector<int> d(2,400);

    c.insert(it+2,d.begin(),d.end());

    int s[]={501,502,503};

    c.insert(c.begin(),s,s+3);

    此时c中元素为:501  502  503  300  300  400  400  200  100  100  100

    5.erase:iterator erase(iterator position):删除position处的元素

                 iterator erase(iterator first,iterator last):删除first到last的元素

    std::vector<int> myvector;
    for (int i=1; i<=10; i++) myvector.push_back(i);
    myvector.erase (myvector.begin()+5);
    myvector.erase (myvector.begin(),myvector.begin()+3);
    std::cout << "myvector contains:";
    for (unsigned i=0; i<myvector.size(); ++i)
      std::cout << ' ' << myvector[i];

    结果为:4  5  7  8  9  10

    6.swap:void swap(vector &x)

    交换两个容器的内容,两个容器中的元素不一定要相等。c.swap(d);

    7.clear:void clear():清楚容器中的所有元素。c.clear();

    8.emplace:iterator emplace(const_iterator position,args&& args):在position处插入一个新的元素。

    std::vector<int> myvector = {10,20,30};

    auto it = myvector.emplace ( myvector.begin()+1, 100 );

    myvector.emplace ( it, 200 );

    myvector.emplace ( myvector.end(), 300 );

    容器中元素为:10  200  100  20  30  300

    9.emplace_back:void emplace_back(args&& args):在最后插入一个元素

    六、分配器

    allocator_type get_allocator() const:给容器分配空间

    std::vector<int> myvector;
      int * p;
      unsigned int i;
      p = myvector.get_allocator().allocate(5);
      for (i=0; i<5; i++) myvector.get_allocator().construct(&p[i],i);
      std::cout << "The allocated array contains:";
      for (i=0; i<5; i++) std::cout << ' ' << p[i];
      std::cout << '
    ';
      for (i=0; i<5; i++) myvector.get_allocator().destroy(&p[i]);
      myvector.get_allocator().deallocate(p,5)

    七、重载函数

    1.重载了操作符"=="  '!='  '<'  '<='  '>'  '>=':对于==来说,首先比较它们的大小,若size相等,则依次比较元素;对于其他运算符,依次比较元素。c==d;

    参考:http://www.cplusplus.com/reference/vector/vector/

  • 相关阅读:
    jquery--blur()事件,在页面加载时自动获取焦点
    jquery三级联动
    工具集
    兼容各个浏览器:禁止鼠标选择文字事件
    jquery 事件委托(利用冒泡)
    小功能1:多种方法实现网页加载进度条
    JavaSE| 泛型
    SSM整合
    Redis数据库 02事务| 持久化| 主从复制| 集群
    Hadoop| MapperReduce02 框架原理
  • 原文地址:https://www.cnblogs.com/shrimp-can/p/5280566.html
Copyright © 2011-2022 走看看