zoukankan      html  css  js  c++  java
  • vector--C++ STL 学习

    vector–C++ STL 学习

    vector对应的数据结构为数组,而且是动态数组,也就是说我们不必关心该数组事先定义的容量是多少,它的大小会动态增长。与数组类似的是,我们可以在末尾进行元素的添加和删除,也可以进行元素值的随机访问和修改。

      vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似.
      不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
      vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。

    首先要引入头文件 #include 。具体使用如下:

    (1)vector的创建

    vector<int> vec1; // 创建一个空的vector
    
    vector<int> vec2(vec1); // 创建一个vector vec2,并用vec1去初始化vec2
    
    vector<int> vec3(10); // 创建一个含有n个数据的vector
    
    vector<int> vec4(10,0); // 创建含有10个数据的vector,并全部初始化为0

    构造函数进行了重载,可以用多种方式创建vector。

    (2)push_back(), pop_back()添加删除元素

    // 在vector尾部添加元素  
    vec1.push_back(4);  
    
    // 在vector尾部删除元素  
    vec1.pop_back();  
    
    // 在vector头部添加元素,无法完成,因为vector的数据结构为数组,无法在头部插入元素,否则需要整个数组前移;  
    
    // 在vector头部删除元素,无法完成,理由同上。

    可以使用push_back()不断的在vector尾部添加元素,使用pop_back删除尾部元素。操作非常的方便,比我们直接用数组结构方便多了。

    (3)[],at(),取某位置的元素值

    // 取vector中某位置的元素值
    cout << "在1位置的元素值为:" << vec1.at(1) << endl;
    cout << "在1位置的元素值为:" << vec1[1] << endl;

    因为vector的数据结构就是一个数组,所以可以进行随机访问。

    (4)begin(),end(),指向头元素、尾元素的指针

    void PrintVector(vector<int> ve)
    {
    cout << "Vector中的数据为:";
    vector<int>::iterator veIterator;
    for (veIterator = ve.begin(); veIterator < ve.end(); veIterator++)
    {
    cout << *veIterator << " ";
    }
    cout << endl;
    }

    可以把迭代器理解为指针,把begin(),end()分别理解为头指针和尾指针。这样就能访问到vector中的每一个元素了。

    (5)back(),front(),访问头部元素和尾部元素

    // 返回尾部数据的引用
    cout << "尾部数据的值为:" << vec1.back() << endl;
    
    // 返回头部数据的引用
    cout << "头部数据的值为:" << vec1.front() << endl;

    (6)max_size(),最大容纳量;size(),当前的元素个数。

    cout << "vector中的最大容量为:" << vec1.max_size() << endl;
    cout << "vector中的元素个数为:" << vec1.size() << endl;

    (7)empty(),判断vector是否为空

    cout << "vector是否为空:" << vec1.empty() << endl;

    如果为空,返回1.否则返回0。

    (8)swap():交换两个vector中的值。

    (9)sort():对vector升序排序;reverse():对vector降序排序。

    // 对vector进行升序排序
    sort(vec1.begin(), vec1.end());
    
    // 对vector进行降序排序
    reverse(vec1.begin(), vec1.end());

    传递的参数是需要排序的范围,因为这里要对整个vector排序,所以参数分别指向头部和尾部。

    (10)[],at():修改元素

    // 修改vector中的某个值
    vec1[2] = 99;
    
    vec1.at(3) = 88;

    (11)erase():删除某个元素

    // 删除数组的某个元素
    // 为什么要使用iterator来进行定位,因为数组如果要删除一个元素或者插入一个元素,会导致其他元素移动,所以不能直接进行删除
    vector<int>::iterator vItera = vec1.begin();
    vItera = vItera + 2;
    vec1.erase(vItera);

    在删除元素时,要借用迭代器。

    (12)insert(): 插入元素

    // vector插入某元素,要使用iterator来定位某个位置
    vector<int>::iterator vInsert = vec1.begin();
    vInsert = vInsert + 2;
    vec1.insert(vInsert, 777);

    同样要借助迭代器。

    (13)clear():清除所有元素

    // 清除所有数据
    vec1.clear();
    cout << "vector是否为空:" << vec1.empty() << endl;

    执行以后就是一个空的vector,不包含任何元素。

    关于vector的更详细介绍可以参考文档:http://en.cppreference.com/w/cpp/container/vector

  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/yangjiannr/p/7391355.html
Copyright © 2011-2022 走看看