vector的用法详解

来源:互联网 发布:整站源码下载工具 编辑:程序博客网 时间:2024/06/05 07:56

摘自各路大佬 

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

2:用法:

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

(2)变量声明:

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

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

(3)功能用法:

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()             返回指向容器最后一个元素的迭代器

(4)迭代器

迭代器相当于指针,例如:

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

使用指针操作该变量
例如: *p = 11; // 操作后a变为 11
对于容器,使用迭代器操作容器中对应位置的值
当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了

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

使用方法:
1.vector 的数据的存入和输出:
#include<stdio.h>#include<vector>#include <iostream>using namespace std;void main(){ int i = 0;  vector<int> v;  for( i = 0; i < 10; i++ ) {      v.push_back( i );//把元素一个一个存入到vector中 }  //对存入的数据清空 for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数 {     cout << v[ i ] << " "; //把每个元素显示出来 } cont << endl;}

注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置

你也可以这样做:

vector<int>::iterator iter;for( iter = v.begin(); iter != v.end(); iter++ ){  cout << *iter << endl;}

2. 对于二维vector的定义。
1)定义一个10个vector元素,并对每个vector符值1-10。
#include<stdio.h>#include<vector>#include <iostream>using namespace std;void main(){int i = 0, j = 0;//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。//所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。vector< vector<int> > Array( 10, vector<int>(0) );for( j = 0; j < 10; j++ ){ for ( i = 0; i < 9; i++ ) {  Array[ j ].push_back( i ); }}for( j = 0; j < 10; j++ ){ for( i = 0; i < Array[ j ].size(); i++ ) {  cout << Array[ j ][ i ] << " "; } cout<< endl;}}
2)定义一个行列都是变化的数组。
#include<stdio.h>#include<vector>#include <iostream>using namespace std;void main(){int i = 0, j = 0;vector< vector<int> > Array;vector< int > line;for( j = 0; j < 10; j++ ){ Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。 for ( i = 0; i < 9; i++ ) {  Array[ j ].push_back( i ); }}for( j = 0; j < 10; j++ ){ for( i = 0; i < Array[ j ].size(); i++ ) {  cout << Array[ j ][ i ] << " "; } cout<< endl;}} 

.算法

(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;}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

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


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;}


kj