1 vector介绍

  • 向量容器(vector)是一种 顺序容器 ,是一块连续分配的内存,支持随机访问,和数组极其相似.

  • 数组跟vector的区别在于:数组是静态分配空间,一旦分配了空间的大小,就不可以再改变了,例如,int a[6]。数组的空间效率不是很好,经常会有空闲的区域没有得到充分利用

  • vector是动态分配内存(动态数组),随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。

  • vector容器的容量增长是按照容器现在容量的一倍进行增长。把之前的数据复制到新的数组之中,再把之前的数组的内存释放,但是每一次扩容vector数组有大量的额外操作,对于时间性能有负面影响的,使用动态数组尽量减少改变数组容量大小的次数(来自剑指offer38页)。

2 vector使用注意

  • 表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低。
  • vector作为函数的参数或者返回值时,需要注意它的写法:
    double Distance(vector&a, vector&b) 其中的“&”绝对不能少!!!
vector<vector<Point2f> > points; //定义一个二维数组
points.size();      //求行数
points[0].size();  //求列数

3 基本操作

(1)头文件:#include.

(2)创建vector对象:vector vec;

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

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

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

vector<int>::iterator it;

for(it=vec.begin();it!=vec.end();it++)

    cout<<*it<<endl;

(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

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

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

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

(9)清空:vec.clear();

4 常用函数详细解释

4.1 begin函数:

函数原型:
iterator begin();
const_iterator begin();
功能:返回一个当前vector容器中起始元素的迭代器。

4.2 end函数:

函数原型:
iterator end();
const_iterator end();
功能:返回一个当前vector容器中末尾元素的迭代器。
注意v1.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素

4.3 front函数:

函数原型:
reference front();
const_reference front();
功能:返回当前vector容器中起始元素的引用。

4.4 back函数:

函数原型:
reference back();
const_reference back();
功能:返回当前vector容器中末尾元素的引用。
//实例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
 vector<char> v1;
 vector<char>::iterator iter1;
 vector<char>::iterator iter2;
 v1.push_back('m');
 v1.push_back('n');
 v1.push_back('o');
 v1.push_back('p');

 cout << "v1.front() = " << v1.front() << endl;
 cout << "v1.back() = " << v1.back() << endl;

 iter1 = v1.begin();
 cout << *iter1 << endl;
 cout <<*v1.begin()<<endl;
 iter2 = v1.end()-1;    //注意v1.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素
                        //的正确操作为:v1.end() - 1;
 cout << *iter2 << endl;
 cout <<*(v1.end()-1)<<endl;
 return 0;
}

在这里插入图片描述

5 vector中insert()的用法详解

c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置。
c.insert(pos,n,elem) // 在pos位置插入n个elem数据。无返回值。
c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值。

//创建一个vector,置入字母表的前十个字符   
vector <char> Avector;   
for( int i=0; i < 10; i++ )   
  Avector.push_back( i + 65 );   
  
//插入四个C到vector中   
vector <char>::iterator theIterator = Avector.begin();   
Avector.insert( theIterator, 4, 'C' );   
  
//显示vector的内容   
for( theIterator = Avector.begin(); theIterator != Avector.end(); theIterator++ )   
  cout < < *theIterator;   

这段代码将显示:CCCCABCDEFGHIJ

#include<vector>  
#include<iostream>  
using namespace std;  
 
int main()  
{  
    vector<int> v(3);  
    v[0]=2; //v[0]是第0个元素 
    v[1]=7;  
    v[2]=9;  
    v.insert(v.begin(),8);//在最前面插入新元素。  
    v.insert(v.begin()+2,1);//在迭代器中第三个元素前插入新元素  
    v.insert(v.end(),3);//在向量末尾追加新元素。  
 
	v.insert(v.end(),4,1);//在尾部插入4个1
 
	int a[] = {1,2,3,4};
	v.insert(v.end(),a[1],a[3]);//在尾部插入a[1]个a[3]
 
    vector<int>::iterator it;  
    for(it=v.begin(); it!=v.end();it++)  
    {  
        cout<<*it<<" ";  
    }  
    cout<<endl;
 
	return 0;
}  
 
//8 2 1 7 9 3 1 1 1 1 4 4
//请按任意键继续. . .

6 vector的reverse和sort的使用

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

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

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

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

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

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

定义排序比较函数:

bool Comp(const int &a,const int &b)
{
    return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。 

7 输出vector中的元素

vector<float> vecClass; 
int nSize = vecClass.size();   
方法一:
for(int i=0;i<nSize;i++)    
{    
   cout<<vecClass[i]<<"     ";    
}    
   cout<<endl;   
方法二:
for(int i=0;i<nSize;i++)    
{    
   cout<<vecClass.at(i)<<"     ";    
}    
 cout<<endl;    
方法三:
for(vector<float>::iterator it = vecClass.begin();it!=vecClass.end();it++)    
{    
    cout<<*it<<"   ";    
}    
cout<<endl;    

注意:

  • [ ]表示法和成员函数at()的差别在于,成员函数at()将在运行期间捕获非法索引,而程序默认将中断。但这种额外检查的代价是运行时间更长。
  • 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;    
}  

初始化

https://blog.csdn.net/veghlreywg/article/details/80400382

a[2]的解释

一般vector容器初始化都是小括号,vector a[2]这条语句的含义是:a数组中有两个元素a[0],a[1],每个元素又是一个vector类型的数组。

个人理解:初始化中加中括号,一般就是看作定义数组。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐