zoukankan      html  css  js  c++  java
  • STL --> vector向量

    vector向量

      vector是一种对象实体,能够容纳许多其他类型相同的元素,因为又被称为容器。

     

    头文件

      在使用它时,需要包含头文件 <vector>。

    #include <vector>

       vector属于std命名域的,因此需要通过命名限定:

    using std::vector;
    vector<int> vec;

    基本操作

    函数

    表述

    c.assign(beg,end)

    c.assign(n,elem)

    将[beg; end)区间中的数据赋值给c。

    将n个elem的拷贝赋值给c。

    c.at(idx)

    传回索引idx所指的数据,如果idx越界,抛出out_of_range。

    c.back()

    传回最后一个数据,不检查这个数据是否存在。

    c.begin()

    传回迭代器重的可一个数据。

    c.capacity()

    返回容器中数据个数。

    c.clear()

    移除容器中所有数据。

    c.empty()

    判断容器是否为空。

    c.end()

    指向迭代器中的最后一个数据地址。

    c.erase(pos)

    c.erase(beg,end)

    删除pos位置的数据,传回下一个数据的位置。

    删除[beg,end)区间的数据,传回下一个数据的位置。

    c.front()

    传回第一个数据。

    get_allocator

    使用构造函数返回一个拷贝。

    c.insert(pos,elem)

    c.insert(pos,n,elem)

    c.insert(pos,beg,end)

    在pos位置插入一个elem拷贝,传回新数据位置。

    在pos位置插入n个elem数据。无返回值。

    在pos位置插入在[beg,end)区间的数据。无返回值。

    c.max_size()

    返回容器中最大数据的数量。

    c.pop_back()

    删除最后一个数据。

    c.push_back(elem)

    在尾部加入一个数据。

    c.rbegin()

    传回一个逆向队列的第一个数据。

    c.rend()

    传回一个逆向队列的最后一个数据的下一个位置。

    c.resize(num)

    重新指定队列的长度。

    c.reserve()

    保留适当的容量。

    c.size()

    返回容器中实际数据的个数。

    c1.swap(c2)

    swap(c1,c2)

    将c1和c2元素互换。

    同上操作。

    vector<Elem> c

    vector <Elem> c1(c2)

    vector <Elem> c(n)

    vector <Elem> c(n, elem)

    vector <Elem> c(beg,end)

    c.~ vector <Elem>()

    创建一个空的vector。

    复制一个vector。

    创建一个vector,含有n个数据,数据均已缺省构造产生。

    创建一个含有n个elem拷贝的vector。

    创建一个以[beg;end)区间的vector。

    销毁所有数据,释放内存。

     声明及初始化

      vector 型变量的声明以及初始化的形式有多种:

    vector<int> a ;                                //声明一个int型向量a
    vector<int> a(10) ;                            //声明一个初始大小为10的向量
    vector<int> a(10, 1) ;                         //声明一个初始大小为10且初始值都为1的向量
    vector<int> b(a) ;                             //声明并用向量a初始化向量b
    vector<int> b(a.begin(), a.begin()+3) ;        //将a向量中从第0个到第2个(共3个)作为向量b的初始值

      还可以直接使用数组来初始化向量:

    int n[] = {1, 2, 3, 4, 5} ;
    vector<int> a(n, n+5) ;              //将数组n的前5个元素作为向量a的初值
    vector<int> a(&n[1], &n[4]) ;        //将n[1] - n[4]范围内的元素作为向量a的初值

    输入及访问

      元素的输入和访问可以像操作普通的数组那样, 用 cin>> 进行输入, cout<<a[n] 这样进行输出,示例:

        #include<iostream>
        #include<vector>
    
        using namespace std ;
    
        int main()
        {
            vector<int> a(10, 0) ;      //大小为10初值为0的向量a
    
            //对其中部分元素进行输入
            cin >>a[2] ;
            cin >>a[5] ;
            cin >>a[6] ;
    
            //全部输出
            int i ;
            for(i=0; i<a.size(); i++)
                cout<<a[i]<<" " ;
    
            return 0 ;
        }

      在元素的输出上, 还可以使用遍历器(又称迭代器)进行输出控制。

      在 vector<int> b(a.begin(), a.begin()+3) ; 这种声明形式中,(a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。(a.begin(), a.end())则表示起始元素和最后一个元素之外的元素位置。向量元素的位置便成为遍历器, 同时向量元素的位置也是一种数据类型, 在向量中遍历器的类型为: vector<int>::iterator。 遍历器不但表示元素位置, 还可以再容器中前后移动。
      在上例中讲元素全部输出部分的代码就可以改写为:

       //全部输出
        vector<int>::iterator t ;
        for(t=a.begin(); t!=a.end(); t++)
            cout << *t << " " ;

     *t 为指针的间接访问形式, 意思是访问t所指向的元素值。

     

    二维向量
      与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:

     vector< vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量

      在这里, 实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。

    例如

        #include<iostream>
        #include<vector>
    
        using namespace std ;
    
        int main()
        {
            vector< vector<int> > b(10, vector<int>(5, 0)) ;
    
            //对部分数据进行输入
            cin>>b[1][1] ;
            cin>>b[2][2] ;
            cin>>b[3][3];
    
            //全部输出
            int m, n ;
            for(m=0; m<b.size(); m++)           //b.size()获取行向量的大小
            {
                for(n=0; n<b[m].size(); n++)    //获取向量中具体每个向量的大小
                    cout<<b[m][n]<<" " ;
                cout<<"
    " ;
            }
    
            return 0;
        }

      同样, 按照这样的思路还可以创建更多维的向量, 不过维数太多会让向量变得难以灵活控制, 三维以上的向量还需酌情使用。

  • 相关阅读:
    Java基本数据类型学习
    【异常】Docker安装elasticsearch7, 浏览使用 9200 无法打开
    docker logs-查看docker容器日志
    centos开开放防火墙
    软工超越日报-android的简单旋转效果实现 5/13
    软工超越日报-Android文件下载器 5/12
    软工超越日报-团队第一阶段冲刺十日谈回顾总结 5/11
    软工超越日报-安卓APP联网获取数据(3) 5/10
    软工超越日报-安卓APP联网获取数据(2) 5/9
    软工超越日报-安卓APP联网下载数据(1) 5/8
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4565394.html
Copyright © 2011-2022 走看看