c++【STL】vector详细解释以及begin(),end(),front(),insert()等函数的使用
本文目录
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类型的数组。
个人理解:初始化中加中括号,一般就是看作定义数组。
更多推荐
所有评论(0)