zoukankan      html  css  js  c++  java
  • vector 类简介和例程

    一、标准库的vector类型

    vector是同一种类型的对象的集合

    vector的数据结构很像数组,能非常高效和方便地访问单个元素

    vector是一个类模板(class template) 

    vector不能存放引用。

    template <
       class Type, 
       class Allocator = allocator<Type> 
    >
    class vector

    要使用vector必须包含相关头文件

    #include <vector>

    using std::vector; 

    vector对象的初始化:

    vector类定义了好几种构造函数

    vector<T>  v1; 

    //vector保存类型为T的对象。默认构造函数v1为空

    vector<T> v2(v1);// v2是v1的一个副本 

    vector<T> v3(n, i); //v3包含n个值为i的元素 

    vector<T> v4(n); //v4含有值初始化的元素的n个副本

    vector<T> v5(v1.begin(), v1.end());  // iterating through v1

    vector常用成员函数:


    resize 和 reserve的区别:

    void reserve(size_type n);

    (1)如果n大于容器现有的容量(即capacity()),则需要在自由内存区为整个容器重新分配一块更大的连续空间,其大小为sizeof(T)*n,然后将容器内所有有效元素全部复制到新位置(调用拷贝构造函数),最后释放旧位置的所有存储空间并调整容器的成员指针。注意:容器的大小(即size())并没有发生改变。

    (2)否则,什么也不做。

    void resize(size_type n, const T& c = T());

    (1)如果n大于容器当前的大小(即size()),则在容器的末尾插入n-size()个初值为c的元素,如果不指定初值,则用元素类型的默认构造函数来初始化(这可能引起内存重分配以及容器容量的扩张)。

    (2)如果n小于容器当前的大小,则从容器的末尾删除size()-n 个元素,但不释放元素本身的内存空间,因此容量不变。

    (3)否则,什么也不做。

    e.g

    vector<char> vec;
    printf(”%zd %zd ”, vec.size(), vec.capacity());
    vec.resize(1024);
    printf(”%zd %zd ”, vec.size(), vec.capacity());
    vec.resize(1300);
    printf(”%zd %zd ”, vec.size(), vec.capacity());

    运行结果:
    0 0 # 一开始size() 和capacity() 都是0
    1024 1024 # resize(1024) 之后size() 和capacity() 都是1024
    1300 2048 # resize(稍大) 之后capacity() 翻倍,相当于reserve(2048)

    例程1:

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include <vector>
    #include <iostream>
    using namespace std;


    typedef vector<int> INTVEC;

    //void ShowVec(const INTVEC& v)
    //{
    //  unsigned int i;
    //  for (i=0; i<v.size(); i++)
    //  {
    //      cout<<v[i]<<" ";
    //  }
    //  cout<<endl;
    //}


    //void ShowVec(INTVEC& v)
    //{
    //  INTVEC::iterator it;
    //  for (it=v.begin(); it!=v.end(); ++it)
    //  {
    //      cout<<*it<<" ";
    //  }
    //
    //  cout<<endl;
    //}

    void ShowVec(const INTVEC &v)
    {
        INTVEC::const_iterator it;
        for (it = v.begin(); it != v.end(); ++it) //所有迭代器都重载了!=运算符,但有些没有重载<运算符。
        {
            cout << *it << " ";
        }

        cout << endl;
    }

    int main(void)
    {
        INTVEC v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);

        ShowVec(v);

        return 0;
    }


    例程2:

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;


    typedef vector<int> INTVEC;

    void ShowVec(const INTVEC &v)
    {
        INTVEC::const_iterator it;
        for (it = v.begin(); it != v.end(); ++it)
        {
            cout << *it << " ";
        }

        cout << endl;
    }

    int main(void)
    {
        INTVEC v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
        v.push_back(4);
        v.push_back(5);
        v.push_back(3);
        //cout<<v.back()<<endl;
        //v.pop_back();

        ShowVec(v);

        //v.erase(v.begin()+2);
        //v.erase(v.begin(), v.begin()+2);

        v.erase(remove(v.begin(), v.end(), 3), v.end());
        ShowVec(v);

        return 0;
    }


    例程3:

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;


    typedef vector<int> INTVEC;

    void ShowVec(const INTVEC &v)
    {
        INTVEC::const_iterator it;
        for (it = v.begin(); it != v.end(); ++it)
        {
            cout << *it << " ";
        }

        cout << endl;
    }

    int main(void)
    {
        INTVEC v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
        v.push_back(4);
        v.push_back(5);
        v.push_back(3);

        ShowVec(v);

        //v.erase(remove(v.begin(), v.end(), 3), v.end());
        INTVEC::iterator it;
        for (it = v.begin(); it != v.end(); /*++it*/)
        {
            if (*it == 3)
            {
                it = v.erase(it);   // erase返回的是当前删除元素的下一个元素
            }
            else
                ++it;
        }
        ShowVec(v);

        return 0;
    }



    参考:

    C++ primer 第四版
    Effective C++ 3rd
    C++编程规范

  • 相关阅读:
    vscode中执行gulp task的简便方法
    5G即将到来,你还会购买4G手机吗?
    小屏幕手机汇总
    NoSQL数据库的分布式算法详解
    如何在网页界面设计中正确的留出空白空间?
    iconfont的三种使用方式
    MySQL修改密码方法汇总
    Docker镜像与容器
    微观经济学
    经营的原点 书评
  • 原文地址:https://www.cnblogs.com/alantu2018/p/8471073.html
Copyright © 2011-2022 走看看