zoukankan      html  css  js  c++  java
  • c++之vector使用

    Vector是向量模板,C++ STL之一(本质上是一个动态数组)。vector是一个动态生长的数组,一开始vector为空时,会给一个初始化的容量 (就是允许的添加个数并申请好内存),当往添加的元素超过现在的容量(capacity)时,就会重新更大申请内存,并把之前的所有元素拷贝到新内存中。数据量不大的情况下,vector非常方便存储和访问操作,当然,数据量大的情况下,查找效率低,删除操作还会导致大量的数组移动操作。

    1 基本操作

    (1)头文件#include<vector>.

    (2)创建vector对象,vector<int> vec;

    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的初值
    
    vector <*int> a;  //a为2维数组
    vector< vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量
    vector <**int> a; //a为3维数组

    (3)尾部插入数字:vec.push_back(a);

    (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

            一开始vector为空时,不能对其进行下标赋值,否则会报越界访问错误。容器为空时添加第一个值用push_back(). 

            要按数组索引赋值的话,必须先指定vec大小,否则会报错。如vector<int>numbers(index); //(index个容量,索引0-(index-1))  numbers[0]=1;

    (5)使用迭代器访问元素.

    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();it++)
        cout<<*it<<endl;  //访问t所指向的元素值

    for(int i=0; i<a.size(); i++)
    cout<<a[i]<<" " ;

    (6)插入元素:    vec.push_back(elem) ; 末尾加入一个元素

    vec.insert(vec.begin()+i,a);在第i个索引位置插入a(即变成第i+1个元素);

    vec.insert(vec.begin(), 3, 1000) ;        //将1000分别插入到向量元素位置的0-2处(共3个元素)

    vec.insert(vec.begin(), vec_a.begin(), vec_a.end()) ;        //将vec_a.begin(), vec_a.end()之间的全部元素插入到vec.begin()前

    (7)删除元素:   

    vec.erase(pos)  // 删除pos位置的数据,传回下一个数据的位置

    vec.erase(vec.begin()+2); 删除第3个元素   

    vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

    删除vector iterator里面某个值:

    vector <int>::iterator it;

    for (it = array.begin(); it != array.end();){

        if(xxxx)

            it=vec.erase(it);

        else

            it++;

    (8)向量大小:vec.size();

    (9)清空:vec.clear();  但是即使clear()清空元素,vector所占用的内存空间依然如故,无法保证内存的回收。

    (10)判断是否为空:  vec.empty()  

    (11)vec_a向量与vec_b向量进行交换:  vec_b.swap(vec_a) ; 

    (12) 返回当前vec里面最后一个元素,vec.back()   而不能vec[-1](索引错误),弹出最后一个元素,vec.pop_back();

    2.  算法函数

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

    reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)

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

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

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

    //定义排序比较函数:
    bool Comp(const int &a,const int &b)
    {
        return a>b;
    }

    调用 sort(vec.begin(),vec.end(),Comp),这样就实现了降序排序。

    对于数组进行排序

    Sort(start,end,排序方法),第三个参数不写的时候默认为升序

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int main(){
      int a[10]={9,6,3,8,5,2,7,4,1,0};
      sort(a,a+10); //默认升序,如果不是10而是6等更小的数字,也可以部分排序
      for(int i=0;i<10;i++)
        cout<<a[i]<<endl;
      return 0;
    }

    (3)合并两个vector: 合并nums1和nums2,并将合并后的数组赋值给nums

    vector<int> nums1(m),nums2(n);
    
    vector<int> nums;
    
    nums.resize(m+n);
    
    merge(nums1.begin(), nums1.end(),nums2.begin(),nums2.end(),nums);

    3.vector里面是结构体

    vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:

    复制代码
    #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; }
    复制代码
  • 相关阅读:
    python读取文件的方法
    python中global 和 nonlocal 的作用域
    android环境安装及配置
    python学习——sys.argv
    python学习——urlparse模块
    android:cmd下面用adb打log
    获取系统的换行符
    python----字符串方法
    类的继承---多重继承(两个父类有相同方法名和参数)
    Djngo 请求的生命周期
  • 原文地址:https://www.cnblogs.com/nicetoseeyou/p/10525121.html
Copyright © 2011-2022 走看看