C++笔记 Vector的用法


1. 什么是vector

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。


 

2. 基本函数实现

2.1 构造函数

  • vector():                                  创建一个空vector
  • vector(int nSize):                   创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t): 创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):          复制构造函数
  • vector(begin,end):                 复制[begin,end)区间内另一个数组的元素到vector中

2.2 增加函数

  • void push_back(const T& x):                       向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):          向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):  向量中迭代器指向元素前增加n个相同的元素x
  • iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

2.3 删除函数

  • iterator erase(iterator it):                         删除向量中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
  • void pop_back():                                       删除向量中最后一个元素
  • void clear():                                                清空向量中所有元素

2.4 遍历函数

  • reference at(int pos):       返回pos位置元素的引用
  • reference front():              返回首元素的引用
  • reference back():              返回尾元素的引用
  • iterator begin():                 返回向量头指针,指向第一个元素
  • iterator end():                     返回向量尾指针,指向向量最后一个元素的下一个位置
  • reverse_iterator rbegin():  反向迭代器,指向最后一个元素
  • reverse_iterator rend():      反向迭代器,指向第一个元素之前的位置

2.5 判断函数

  • bool empty() const:               判断向量是否为空,若为空,则向量中无元素

2.6 大小函数

  • int size() const:              返回向量中元素的个数
  • int capacity() const:        返回当前向量张红所能容纳的最大元素值
  • int max_size() const:      返回最大可允许的vector元素数量值

2.7 其他函数

  • void swap(vector&):                                                      交换两个同类型向量的数据
  • void assign(int n,const T& x):                                         设置向量中第n个元素的值为x
  • void assign(const_iterator first, const_iterator last):   向量中[first,last)中元素设置成当前向量元素

2.8 看着清楚

  1. push_back: 在数组的最后添加一个数据
  2. pop_back:   去掉数组的最后一个数据
  3. at:               得到编号位置的数据
  4. begin:         得到数组头的指针
  5. end:            得到数组的最后一个单元+1的指针
  6. front:           得到数组头的引用
  7. back:           得到数组的最后一个单元的引用
  8. max_size:   得到vector最大可以是多大
  9. capacity:     当前vector分配的大小
  10. size:            当前使用数据的大小
  11. resize:         改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
  12. reserve:       改变当前vecotr所分配空间的大小
  13. erase:          删除指针指向的数据项
  14. clear:           清空当前的vector
  15. rbegin:         将vector反转后的开始指针返回(其实就是原来的end-1)
  16. rend:           将vector反转构的结束指针返回(其实就是原来的begin-1)
  17. empty:        判断vector是否为空
  18. swap:         与另一个vector交换数据

 

3. 用法与实例

#include < vector>
using namespace std;

3.1 vector 的初始化(举例说明)

  • vector<int> a(10);  //定义了10个整型元素的向量,不具有初值,其值不确定
  • vector<int> a(10, 1);  //定义了10个整型元素的向量,且给出每个元素的初值为1
  • vector<int> a(b);  //用b向量来创建a向量,整体复制性赋值
  • vector<int> a(b.begin(),b.begin+3);  //定义了a值为b中第0个到第2个(共3个)元素
  • int b[7]={1,2,3,4,5,9,8};  vector<int> a(b,b+7);   //从数组中获得初值
  • vector<vector<int> > vobj(N);   //定义二维动态数组大小N行
  • vector<vector<int> > vobj(N, vector<int>(M));   //定义二维动态数组N行M列 

3.2 vector对象的常用内置函数使用(举例说明)

  1. a.assign(b.begin(), b.begin()+3);    //b为向量,将b的0~2个元素构成的向量赋给a
  2. a.assign(4,2);    //是a只含4个元素,且每个元素为2
  3. a.back();    //返回a的最后一个元素
  4. a.front();    //返回a的第一个元素
  5. a[i];    //返回a的第i个元素,当且仅当a[i]存在
  6. a.clear();    //清空a中的所有元素
  7. a.empty();    //判断a是否为空,空则返回ture,不空则返回false
  8. a.pop_back();    //删除a向量的最后一个元素
  9. a.erase(a.begin()+1,a.begin()+3);    //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+ 3(不包括它)
  10. a.push_back(5);    //在a的最后一个向量后插入一个元素,其值为5
  11. a.insert(a.begin()+1,5);    //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
  12. a.insert(a.begin()+1,3,5);    //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
  13. a.insert(a.begin()+1,b+3,b+6);    //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
  14. a.size();    //返回a中元素的个数;
  15. a.capacity();    //返回a在内存中总共可以容纳的元素个数
  16. a.resize(10);    //将a的现有元素个数调至10个,多则删,少则补,其值随机
  17. a.resize(10,2);    //将a的现有元素个数调至10个,多则删,少则补,其值为2 
  18. a.reserve(100);   //将a的容量扩充至100,改变当前容器的最大容量(capacity),它不会生成元素.
  19. a.swap(b);    //b为向量,将a中的元素和b中的元素进行整体性交换
  20. a==b;    //b为向量,向量的比较操作还有!=,>=,<=,>,<

特别注意:

begin()与end()函数、front()与back()的差别:begin()与end()返回的是<迭代器>,front()与back()返回的是<引用>。begin()指向的是第一个一个元素的前一个位置,从第一个元素插入用begin()+1。end()指向的是最后一个元素的下一个位置,所以访问最后一个元素,所以 iter = v1.end()-1 是使iter指向最后一个元素 。

reverse() 与reserve()的区分:reverse()是倒置算法,reserve()是调整容量

size()与capacity()的区别:size()是元素长度,capacity()是容器容量

 

3.3 顺序访问vector的几种方式,举例说明

3.3.1 对向量a添加元素的几种方式

1.向向量a中添加元素

vector<int>a;
for(int i=0;i<10;++i){a.push_back(i);}

2.从数组中选择元素向向量中添加

int a[6]={1,2,3,4,5,6};
vector<int> b;
for(int i=0;i<=4;++i){b.push_back(a[i]);}

3.从现有向量中选择元素向向量中添加

int a[6]={1,2,3,4,5,6};
vector<int>b;
vector<int>c(a,a+4);
for(vector<int>::iterator it=c.begin();it<c.end();++it)
{
    b.push_back(*it);
}

4.从文件中读取元素向向量中添加

ifstream in("data.txt");
vector<int>a;
for(int i;in>>i){a.push_back(i);}

5.常见错误赋值方式

vector<int>a;
for(int i=0;i<10;++i){a[i]=i;} //下标只能用来获取已经存在的元素


3.3.2 从向量中读取元素

1.通过下标方式获取

int a[6]={1,2,3,4,5,6};
vector<int>b(a,a+4);
for(int i=0;i<=b.size()-1;++i){cout<<b[i]<<endl;}

2.通过迭代器方式读取

 int a[6]={1,2,3,4,5,6};
 vector<int>b(a,a+4);
 for(vector<int>::iterator it=b.begin();it!=b.end();it++){cout<<*it<<"  ";}

 

3.3.3 几个常用的算法

 #include<algorithm>

vector本身没有这些方法,其是依靠algorithm来实现的。

1)sort();   //排序

sort(a.begin(),a.end()); 
 /* 对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列 */

2)reverse(); //倒置

reverse(a.begin(),a.end());
/* 把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素 */

3)copy();  //拷贝

copy(a.begin(),a.end(),b.begin()+1); 
/* 把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素 */

4)find(); //查找

vector<int>::iterator it = find(a.begin(), a.end(), 6); 
if (it != vec.end()) 
    cout<<*it<<endl;   
/* 在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的迭代器以供访问。 */

 


原文链接:

https://www.cnblogs.com/zsq1993/p/5929806.html

https://blog.youkuaiyun.com/weixin_41743247/article/details/90635931

https://blog.youkuaiyun.com/w_linux/article/details/71600574

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值