zoukankan      html  css  js  c++  java
  • C++STL之vector向量容器

    vector向量容器
     
    vector向量容器不但能向数组一样对元素进行随机访问, 还能在尾部插入元素
    vector具有内存自动管理的功能, 对于元素的插入和删除, 可动态调整所占的内存空间
    vector容器的下标是从0开始计数的, 也就是说, 如果vector容器的大小是n, 那么, 元素的下标是0~n-1
     
    对于vector容器的容量定义, 可以事先定义一个固定的大小, 事后, 可以随时调整其大小;
    也可以事先不定义, 随时使用push_back()方法从尾部扩张元素, 也可以使用insert()在某个元素位置前插入新元素
     
    vector容器有两个重要的方法, begin()和end().
    begin()返回的是首元素位置的迭代器
    end()返回的是最后一个元素的下一个元素位置的迭代器
     
    1.1创建vector对象
    (1)不指定容器的元素个数, 如定义一个用来存储整型的容器:
    vector<int> v;
    (2)创建时, 指定容器的大小, 如定义一个用来存储10个double类型元素的向量容器
    vector<double> v(10);
    注意, 元素的下标为0~9; 另外, 每个元素的值被初始化为0.0
    (3)创建一个具有n个元素的向量容器对象, 每个元素具有指定的初始值:
    vector<double> v(10, 8.6)
    上述语句定义了v向量容器, 共有10个元素, 每个元素的值是8.6
     
    1.2尾部元素扩张
    尾部追加元素, vector容器会自动分配新内存空间, 可对空的vector对象扩张, 也可对已有元素的vector对象扩张
    下面代码将2,7,9三个元素从尾部添加到v容器中, 这样, v容器中就有了三个元素, 其值依次是2,7,9
    #include<iostream>
    #include<vector>
    using namespace std;
     
    int main()
    {
        vector<int> v;
        v.push_back(2);
        v.push_back(7);
        v.push_back(9);
        for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
        return 0;
    }
     
    1.3下标方式访问vector元素
    对于vector对象, 可以采用下标方式随意访问它的某个元素, 当然, 也可以以下标的方式对某元素重新赋值, 这点类似于数组的访问方式
    下面的代码就是采用下标方式对数组赋值, 再输出元素的值2,7,9:
    #include<iostream>
    #include<vector>
    using namespace std;
     
    int main()
    {
        vector<int> v(3);
        v[0] = 2;
        v[1] = 7;
        v[2] = 9;
        cout << v[0] << " " << v[1] << " " << v[2] << endl;
        return 0;
    }
     
    1.4用迭代器访问vector元素
    常使用迭代器配合循环语句来对vector对象进行遍历访问, 迭代器的类型一定要与它要遍历的vector对象的元素类型一致
    下面的代码采用迭代器对vector进行了遍历, 输出2,7,9:
    #include<iostream>
    #include<vector>
    using namespace std;
     
    int main()
    {
        vector<int> v(3);
        v[0] = 2;
        v[1] = 7;
        v[2] = 9;
        //定义迭代器变量
        vector<int>::iterator it;
        for(it = v.begin(); it != v.end(); it++)
        {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        cout << endl;
        return 0;
    }
     
    1.5元素的插入
    insert()方法可以在vector对象的任意位置前插入一个新的元素, 同时, vector自动扩张一个元素空间, 插入位置后的所有元素依次向后挪动一个位置
    要注意的是, insert()方法要求插入的位置, 是元素的迭代器位置, 而不是元素的下标
    下面的代码输出结果是: 8,2,1,7,9,3:
    #include<iostream>
    #include<vector>
    using namespace std;
     
    int main()
    {
        vector<int> v(3);
        v[0] = 2;
        v[1] = 7;
        v[2] = 9;
        //在最前面插入新元素, 元素值为8
        v.insert(v.begin(), 8);
        //在第2个元素前面插入新元素1
        v.insert(v.begin() + 2, 1);
        //在向量末尾追加新元素3
        v.insert(v.end(), 3);
        //定义迭代器变量
        vector<int>::iterator it;
        for(it = v.begin(); it != v.end(); it++)
        {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        cout << endl;
        return 0;
    }
     
    1.6元素的删除
    erase()方法可以删除vector中迭代器所指的一个元素或一段区间中的所有元素
    clear()方法则可以一次性删除vector中的所有元素
    下面这段代码演示了vector元素的删除方法:
    #include<iostream>
    #include<vector>
    using namespace std;
     
    int main()
    {
        vector<int> v(10);
        //给向量赋值
        for(int i = 0; i < 10; i++)
        {
            v[i] = i;
        }
        //删除2号元素, 从0开始计数
        v.erase(v.begin() + 2);
        //定义迭代器变量
        vector<int>::iterator it;
        for(it = v.begin(); it != v.end(); it++)
        {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        cout << endl;
        //清空向量
        v.clear();
        //输出向量大小
        cout << v.size() << endl;
        return 0;
    }
     
    1.7使用reverse反向排列算法
    reverse 反向排列算法, 需要定义头文件"#include<algorithm>", 可将向量中某段迭代器区间元素反向排列, 看下面这段代码:
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
     
    int main()
    {
        vector<int> v(10);
        //给向量赋值
        for(int i = 0; i < 10; ++i)
        {
            v[i] = i;
        }
        //反向排列向量的从首到尾的元素
        reverse(v.begin(), v.end());
        //定义迭代器变量
        vector<int>::iterator it;
        for(it = v.begin(); it != v.end(); it++)
        {
            //输出迭代器上的元素值
            cout << *it << " ";
        }
        cout << endl;
        return 0;
    }
     
    1.8使用sort算法对向量元素排序
    使用sort算法, 需要声明"include<algorithm>"头文件
    sort算法要求使用随机访问迭代器进行排序, 在默认的情况下, 对向量元素进行升序排列, 下面这个程序很好的说明了sort算法的使用方法:
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
     
    int main()
    {
        vector<int> v;
        int i;
        //赋值
        for(i = 0; i < 10; ++i)
        {
            v.push_back(9 - i);
        }
        //输出排序前的元素值
        for(i = 0; i < 10; ++i)
        {
            cout << v[i] << " ";
        }
        cout << endl;
        //排序, 升序排列
        sort(v.begin(), v.end());
        //输出排序后的元素值
        for(i = 0; i < 10; ++i)
        {
            cout << v[i] << " ";
        }
        cout << endl;
        return 0;
    }
     
    还可以自己设定排序比较函数, 然后, 把这个函数指定给sort算法, 那么, sort就根据这个比较函数指定的排序规则进行排序, 下面的程序自己设计了一个排序比较函数Comp, 要求对元素的值由大到小排序:
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
     
    //自己设计的排序比较函数, 对元素的值进行降序排列
    bool Comp(const int &a, const int &b)
    {
        if(a != b)
            return a > b;
        else
            return a > b;
    }
     
    int main()
    {
        vector<int> v;
        int i;
        for(i = 0; i < 10; ++i)
        {
            v.push_back(i);
        }
        for(i = 0; i < 10; ++i)
        {
            cout << v[i] << " ";
        }
        cout << endl;
        sort(v.begin(), v.end(), Comp);
        for(i = 0; i < 10; ++i)
        {
            cout << v[i] << " ";
        }
        cout << endl;
        return 0;
    }
     
    1.9向量的大小
    使用size()方法可以返回相连的大小, 即元素的个数
    使用empty()方法可以返回向量是否为空
    下面这段代码演示了size()方法和empty()方法的用法:
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
     
    int main()
    {
        vector<int> v(10);
        for(int i = 0; i < 10; ++i)
        {
            v[i] = i;
        }
        cout << v.size() << endl;    //元素的个数
        cout << v.empty() << endl;    //非空为0
        v.clear();
        cout << v.empty() << endl;    //空为1
        return 0;
    }
     
    /*
    10
    0
    1
    */
     
     
    另外, 向量的类型可以是int, double, char等简单类型, 也可以是结构体或string基本字符序列容器, 使用起来非常灵活.
  • 相关阅读:
    JSON获取地址
    Java的selenium代码随笔(8)
    Java的selenium代码随笔(7)
    Java的selenium代码随笔(6)
    MySql插入点数据
    Win7系统用户文件夹多出一个Administrator.xxx开头的文件怎么解决
    Android Studio导入第三方类库的方法
    转:eclipse 设置Java快捷键补全
    解决android studio引用远程仓库下载慢(JCenter下载慢)
    AndroidStudio下载地址
  • 原文地址:https://www.cnblogs.com/mjn1/p/10296768.html
Copyright © 2011-2022 走看看