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

          

         一、概述

        vector 是C++标准模板库的部分内容,他是一个多功能的,能够操作多种 数据结构和算法 的模板类和函数库。

        vector 是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。 

    1 //C语言风格
    2 int myhouse[100];
    3 //采用vector
    4 vector<int>  vecmyhouse(100);

         当如上定义后,vecmyhouse就可以存放100个int 型的数据了。

    1 它可以像普通数组一样访问  

    1 vecmyhouse[50] = 1024;

    2 你可以顺序的向容器中填充数据

    1 int i=0;
    2 for(;i<25;i++)
    3 {
    4     vecmyhouse.push_back(1);
    5 }

     3 可以动态的改变它的大小,通过下面这条语句实现

      将容器的大小改为400,这样容器中就可容纳400个int 型数据了

    1 vecmyhouse.resize(400);

     4 可以在容器中装入自定义的数据类型

    1 //自定义一个class
    2 class cmyclass
    3 {
    4    。。。。。
    5 };
    6 //定义一个存放class的容器
    7 vector<cmyclass>   vedmyhouse;

     5 可以在定义容器时为他赋初值

    1 //定义一个容纳100个int型数据的容器,初值赋为0
    2 vector<int>   vecmyhouse(100,0);

     6 可以把一个容器的对象赋值给另外一个容器

    1 //定义一个容纳100个int型数据的容器,初值赋为0
    2 vector<int> vecmyhouse(100,0);
    3 //定义一个新的容器,内容与上述容器一样
    4 vector<int>  myvec;
    5 myvec = vecmyhouse;

    二、 以上是vector容器的简单介绍,下面将详细介绍它的其他功能:

      1 为了使用vector ,必须在你的头文件中包含下面的代码:

    1 #include <vector>

       2 vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上

    1 using std::vector;  
    or
    using namespace std;
    or
    std::vector<int> myhouse; //直接加上前缀

       3 vector的声明

       vector<ElemType> c;   创建一个空的vector

       vector<ElemType> c1(c2); 创建一个vector c1,并用c2去初始化c1

       vector<ElemType> c(n) ; 创建一个含有n个ElemType类型数据的vector;

       vector<ElemType> c(n,elem); 创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;

       c.~vector<ElemType>(); 销毁所有数据,释放资源;

      4 vector 容器中常用的函数(c为一个容器对象)

      c.push_back(elem);         在容器的最后位置添加一个元素elem

      c.pop_back();                 删除容器最后位置处的元素

      c.at(index);                    返回指定index位置处的元素

      c.begin();                       返回指向容器最开始位置数据的指针

      c.end();                          返回指向容器最后第一个数据单元的指针+1

      c.front();                        返回容器最开始单元数据的引用

      c.back();                         返回容器最后一个数据的引用

      c.max_size();                  返回容器的最大容量

      c.size();                         返回当前容器中实际存放元素的个数

      c.capacity();                   同c.size()  

      c.resize();                      重新设置vector的容量

      c.reserve();                    同c.resize(); 

      c.erase(p);                     删除指针p指向位置的数据,返回指向下一个数据位置的指针(迭代器)

      c.erase(begin,end);         删除begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)

      c.clear();                        清除所有数据

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

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

      c.empty();                      判断容器是否为空,若为空返回true,否则返回false

      c1.swap(c2);                   交换俩个容器中的数据

      c.insert(p,elem);              在指针p指向的位置插入数据elem,返回指向elem位置的指针

      c.insert(p,n,elem);           在位置p插入n个elem数据,无返回值

      c.insert(p,begin,end)        在位置p插入在区间[begin,end)的数据,无返回值

      三、下面描述一下什么是迭代器

       迭代器相当于指针

    1 //对于变量而言,使用指针指向对应的变量
    2 //以后就可以使用 * 加指针来操作变量了
    3 int a = 10;
    4 int *p;
    5 p = &a;

       使用指针操作该变量,例如:*p = 11; // 操作后a变为 11

       对于容器,使用迭代器操作容器中对应位置的值

       当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了

    1 //定义一个vector
    2 std::vector<int>  myvec;
    3 //添加10个元素
    4 for(int  j=0; j<10; j++)
    5 {
    6    myvec.push_back(j);
    7 }
     1 // 定义一个迭代器  
     2 std::vector<int>::iterator p;  
     3 // 指向容器的首个元素  
     4 p = myVec.begin();  
     5 // 移动到下一个元素  
     6 p ++;  
     7 // 修改该元素赋值  
     8 *p = 20 ; //< 则myVec容器中的第二个值被修改为了20  
     9 // 循环扫描迭代器,改变所有的值  
    10 p = myVec.begin();  
    11 for( ; p!= myVec.end(); p++ )  
    12 {  
    13 *p = 50;  
    14 }  

     

     四  实例

      1 /*---------------------------------------------
      2    http://www.cnblogs.com/ziyi--caolu/archive/2013/07/04/3170928.html
      3    http://blog.csdn.net/twphoenix/article/details/50628468#
      4 ----------------------------------------------*/
      5 
      6 #include <iostream>
      7 #include <vector>
      8 #include <stdlib.h>
      9 #include <algorithm>
     10 
     11 
     12 using namespace std;
     13 
     14 /*-----------------------------------------
     15  【1】 数据的输入和删除。push_back 和pop_back
     16   依次在末尾加入输入的数字,然后将最后一个元素删除(success)
     17 -----------------------------------------*/
     18 /*
     19 void main()
     20 {
     21     int i=0;
     22     vector<int> v;
     23     for (i = 0; i < 10; i++)
     24     {
     25         cin >> i;
     26         v.push_back(i);     //将元素添加到数组最后
     27     }
     28     for (i = 0; i < v.size(); i++)   //v.size() 表示vector存入元素的个数  
     29     {
     30         cout << "结果  
    "<<v[i] << endl;
     31         //system("pause");
     32         
     33     }
     34     printf("
    ");
     35     v.pop_back();          //将数组最后一个元素删除
     36     
     37     for (i = 0; i < v.size(); i++)
     38     {
     39         cout << v[i] << endl;
     40     }
     41     
     42     printf("
    ");
     43     
     44     system("pause"); //madan,千万不要写成puse
     45     
     46 }
     47 */
     48 
     49 
     50 /*---------------------------------------------------
     51   【2】元素的访问(调试不成功)
     52 -----------------------------------------------------*/
     53 /*
     54 void main()
     55 {
     56     int i, n;
     57     vector<int> v;
     58     vector<int>::iterator it;     //声明一个vector的迭代器
     59 
     60     for (i = 0; i < 10; i++)
     61     {
     62         cin >> n;
     63         v.push_back(n);
     64     }
     65     
     66     //(1) 通过操作[]访问
     67     for (i = 0; i < v.size(); i++)
     68     {
     69         cout << v[i] << endl;    
     70     }
     71     cout<<"
    ";
     72     
     73     //(2)通过 at(index) 访问
     74     for (i = 0; i < v.size(); i++)
     75     {
     76         cout << v.at(i);       
     77     }
     78     printf("
    ");
     79     
     80     //(3)通过迭代器iterator访问
     81     for (it = v.begin(); it != v.end(); it++)
     82     {
     83         cout<< *it<<endl;
     84     }
     85     printf("
    ");
     86     
     87     system("pause");
     88 
     89 }
     90 */
     91 
     92 /*----------------------------------------------
     93  【3】排序和查询 (升序和降序那里有点问题)
     94 ------------------------------------------------*/
     95 /*
     96 void main()
     97 {
     98     int i, n;
     99     vector<int> v;
    100     vector<int>::iterator it;    //声明一个vector的迭代器
    101 
    102     for (i = 0; i < 10; i++)
    103     {
    104         cin >> n;
    105         v.push_back(n);
    106     }
    107     it = find(v.begin(),v.end(),3);     //进行查找元素3
    108     if (it == v.end())                   //如果没有该元素,则返回指向容器最后一个单元+1的指针
    109     {
    110         printf("该元素不存在与容器中 
    ");
    111     }
    112     else
    113     {
    114         printf("%d 
    ",it - v.begin());
    115     }
    116     
    117     sort(v.begin(),v.end());     //升序进行排序
    118     for (i = 0; i <10; i++)
    119     {
    120         cout << v[i]<<" ";
    121     }
    122     
    123     reverse(v.begin(),v.end());   //降序进行排序
    124     for (i = 0; i <10; i++)
    125     {
    126         cout << v[i] << " ";
    127     }
    128     
    129     system("pause");
    130     
    131 }
    132 */
    133 
    134 /*---------------------------------------------------
    135  【4】 二维容器(没太明白)
    136 -----------------------------------------------------*/
    137 void main()
    138 {
    139     int i, j;
    140     int m;
    141     vector< vector<int> >   v;   //定义二维容器的时候,最外面俩个<> 处一定要有空格,否则会报错
    142     vector<int> v1;
    143     for (i = 0; i < 4; i++)  //使用二维容器之前对其进行初始化,否则会报错
    144     {
    145         v.push_back(v1);
    146     }
    147     for (i = 0; i < 4; i++)
    148     {
    149         for (j = 0; j < 4; j++)
    150         {
    151             cin >> m;
    152             v[i].push_back(m);
    153         }
    154     }
    155     printf("%d 
    ",v.size());    //返回当前容器中的元素个数(不应该是16或更多么??????但实际是 4???)
    156     
    157     for (i = 0; i < v.size(); i++)
    158     {
    159         for (j = 0; j < v[i].size(); j++)
    160         {
    161             printf("%d ",v[i][j]);
    162         }
    163         printf("
    ");
    164     }
    165     system("pause");
    166 
    167 }

     

      

    ...................未完待续

  • 相关阅读:
    MySQL体系结构
    简单高效的代码部署方法
    笔试算法题(07):还原后序遍历数组 & 半翻转英文句段
    笔试算法题(06):最大连续子数组和 & 二叉树路径和值
    笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素
    笔试算法题(04):实现 string & memcpy & strcpy & strlen
    笔试算法题(03):最小第K个数 & 判定BST后序序列
    笔试算法题(02):N阶阶乘 & 双向循环链表实现
    笔试算法题(01):字符串倒置 & 八皇后问题
    chosen选择框加载数据
  • 原文地址:https://www.cnblogs.com/wyuzl/p/6227536.html
Copyright © 2011-2022 走看看