zoukankan      html  css  js  c++  java
  • c++中vector的用法详解

    vector(向量):

    C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.

    用法:

    文件包含: 首先在程序开头处加上#include以包含所需要的类文件vector 还有一定要加上using namespace std;

    变量声明:

    例:声明一个int向量以替代一维的数组:vector a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。

     例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector a.同理想用向量代替三维数组也是一样,vector <int**>a;再往上面依此类推.

    具体的用法以及函数调用:

    如何得到向量中的元素?其用法和数组一样:

    例如: vector a int b = 5; a.push_back(b);//该函数下面有详解 cout<<a[0]; //输出结果为5

    1.push_back 在数组的最后添加一个数据

    2.pop_back 去掉数组的最后一个数据

    3.at 得到编号位置的数据

    4.begin 得到数组头的指针

    5.end 得到数组的最后一个单元+1的指针

    特别提示:这里有begin()与end()函数、front()与back()的差别

    6.front 得到数组头的引用

    7.back 得到数组的最后一个单元的引用

    8.max_size 得到vector最大可以是多大

    9.capacity 当前vector分配的大小

    10.size 当前使用数据的大小

    11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

    12.reserve 改变当前vecotr所分配空间的大小

    13.erase 删除指针指向的数据项

    14.clear 清空当前的vector

    15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)

    16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

    17.empty 判断vector是否为空

    18.swap 与另一个vector交换数据

     详细的函数实现功能:

    vector c. c.clear() 移除容器中所有数据。

    c.empty() 判断容器是否为空。

    c.erase(pos) 删除pos位置的数据

    c.erase(beg,end) 删除[beg,end)区间的数据

    c.front() 传回第一个数据。

    c.insert(pos,elem) 在pos位置插入一个elem拷贝

    c.pop_back() 删除最后一个数据。

    c.push_back(elem) 在尾部加入一个数据。

    c.resize(num) 重新设置该容器的大小

    c.size() 回容器中实际数据的个数。

    c.begin() 返回指向容器第一个元素的迭代器

    c.end() 返回指向容器最后一个元素的迭代器

    特别注意:

    使用vector需要注意以下几点:

    1、如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;

    2、Vector作为函数的参数或者返回值时,需要注意它的写法:

       double Distance(vector<int>&a, vector<int>&b) 其中的“&”绝对不能少!!!

    3、vector的元素不仅仅可以是int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。

    实例:

    vector<int>test;
    
    //建立一个vector,int为数组元素的数据类型,test为动态数组名
    
    简单的使用方法如下:
    
    vector<int>test;//建立一个vector
    
    test.push_back(1);
    
    test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2

     

    自己见到的实例:

    vector<vector<Point2f> > points; //定义一个二维数组
    
    points[0].size();  //指第一行的列数
    
    #include<stdio.h>  
    #include<algorithm>  
    #include<vector>  
    #include<iostream>  
    using namespace std;  
      
    typedef struct rect  
    {  
        int id;  
        int length;  
        int width;  
      
      //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。  
      bool operator< (const rect &a)  const  
        {  
            if(id!=a.id)  
                return id<a.id;  
            else  
            {  
                if(length!=a.length)  
                    return length<a.length;  
                else  
                    return width<a.width;  
            }  
        }  
    }Rect;  
      
    int main()  
    {  
        vector<Rect> vec;  
        Rect rect;  
        rect.id=1;  
        rect.length=2;  
        rect.width=3;  
        vec.push_back(rect);  
        vector<Rect>::iterator it=vec.begin();  
        cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;      
      
    return 0;  
      
    }  
    

      

    算法

    (1) 使用reverse将元素翻转:需要头文件#include<algorithm>

    reverse(vec.begin(),vec.end());将元素翻转,即逆序排列!

    (在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含)

    (2)使用sort排序:需要头文件#include<algorithm>,

    sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

    可以通过重写排序比较函数按照降序比较,如下:

    定义排序比较函数:

    bool Comp(const int &a,const int &b)
    {
        return a>b;
    }

    调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。 

     

    输出Vector的中的元素   

    vector<float> vecClass; 

    int nSize = vecClass.size();   

     //打印vecClass,方法一:  

    for(int i=0;i<nSize;i++)    
    {    
       cout<<vecClass[i]<<"     ";    
    }    
       cout<<endl;
    

      

    需要注意的是:以方法一进行输出时,数组的下表必须保证是整数。

     //打印vecClass,方法二:     

    for(int i=0;i<nSize;i++)    
    {    
       cout<<vecClass.at(i)<<"     ";    
    }    
       cout<<endl;    
     
    

      

    //打印vecClass,方法三:输出某一指定的数值时不方便

    for(vector<float>::iterator it = vecClass.begin();it!=vecClass.end();it++)    
    {    
        cout<<*it<<"   ";    
    }    
        cout<<endl;    
    

      

    二维数组的使用:

    #include "stdafx.h"  
    #include <cv.h>  
    #include <vector>   
    #include <iostream>   
    using namespace std;  
    int main()  
    {  
        using namespace std;  
        int out[3][2] = { 1, 2,   
                 3, 4,  
                5, 6 };  
        vector <int*> v1;  
      
        v1.push_back(out[0]);  
        v1.push_back(out[1]);  
        v1.push_back(out[2]);  
      
        cout << v1[0][0] << endl;//1  
        cout << v1[0][1] << endl;//2  
        cout << v1[1][0] << endl;//3  
        cout << v1[1][1] << endl;//4  
        cout << v1[2][0] << endl;//5  
        cout << v1[2][1] << endl;//6  
      
        return 0;  
    }  
    

      

    本文作者:银河渡舟
    版权声明:本文采用 CC BY-NC-SA 3.0 CN协议进行许可
  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/widerg/p/6375809.html
Copyright © 2011-2022 走看看