vector的用法详解

xiaoxiao2021-02-27  210

摘自各路大佬 

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

调用时: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
转载请注明原文地址: https://www.6miu.com/read-17127.html

最新回复(0)