vector用法---C++

本文详细讲解了C++中vector的初始化方法,包括一维和二维数组的实例,以及常用的重要操作,如push_back、pop_back、at等。特别关注了迭代器在vector操作后的失效问题及其解决方案。
摘要由CSDN通过智能技术生成


vector初始化

以int类型为例:

一维数组初始化

vector为空, size为0,容器中没有元素,适用于元素个数未知,需要在程序中动态添加的情况。

vector<int> nums;  

初始化为列表中元素的拷贝,列表中元素必须与nums 的元素类型相容,其他类型会进行类型转换。

vector<int> nums = {0,1,2,3.0,4,5,6,7,8,9};
vector<int> nums {0,1,2,3.0,4,5,6,7,8,9};

拷贝初始化,nums2 初始化为nums的拷贝,nums2 将具有和nums相同的容量和元素

vector<int> nums2 = nums; 
vector<int> nums2(nums); 

指定值初始化,nums被初始化为包含10个值为5的int类型

//包含10个元素,对于int,默认被赋值为0
vector<int> nums(10);  
//nums被初始化为包含10个值为5的int类型
vector<int> nums(10,5);

二维数组初始化

vector<vector<int>> nums;
vector<vector<int>> nums = {{1,2,3},{4,5,6},{7,8,9}};
vector<vector<int>> nums(m,vector<int>(n));
//初始化一个 二维的vector 行 m,列 n,且值为0
vector<vector<int>> nums(m,vector<int>(n,6));
//初始化一个 二维vector 行 m,列 n,且所有值都为6;

vector的重要操作

常用函数

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

1. 容量

  • vec.size();// 返回向量大小,当前拥有的元素个数
  • vec.capacity();//返回当前容器可以存储的元素个数,实际存储空间的大小
  • vec.empty();// 当元素个数为0时返回true,否则为false

2. 迭代器

  • vec.begin(); // 返回第一个元素的迭代器
  • vec.end(); // 返回的是越界后的第一个位置

3. 元素的访问

  • vec[0];// 访问下标为0的元素
  • vec.at(1); // 以上两者的区别就是at会检查是否越界,是则抛出out of range异常
  • vec.front();// 访问第一个元素
  • vec.back();// 访问最后一个元素

4. 修改

  • vec.push_back(a); // 尾部插入数字a
  • vec.pop_back ( );// 删除最后一个元素
  • vec.insert(vec.begin()+i,a);// 在第i个元素后面插入a
  • vec.erase(vec.begin()+i);// 删除第i个元素
  • vec.erase(vec.begin()+i,vec.end()+j);// 删除区间[i,j-1]的元素
  • vec.clear();// 清空内容,vec.size()为0

5. 算法

  • reverse(vec.begin(),vec.end());// 将元素翻转,需要头文件#include < algorithm >
  • sort(vec.begin(),vec.end());// (默认是按升序排列,即从小到大)
  • sort(vec.begin(),vec.end(),compare);// 降序排列,其中compare函数需自行定义如下:
bool compare(const int &a,const int &b)
    return a>b;
  • 遍历元素
//迭代器
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
    cout << *it << endl;
    
//元素直接访问
for (size_t i = 0; i < vec.size(); i++) {
	cout << vec.at(i) << endl;
}

迭代器的失效

迭代器的失效是指:
在容器内进行插入元素或者删除元素之后,迭代器不能正常的访问或遍历数据,使其失去了本来的功能。
可能的原因

  • vector进行了内存的重新分配,此时原来已经分配的内存已经释放,之前赋值的迭代器已经是指向了无效的内存。
  • assign的过程中内部数组不够大,触发了对数组的重新分配,就是说原来的数组已经给delete掉了。
  • 进行插入或删除的时候,有一些我们之前定义好的迭代器,由于数据元素的移动,它原本的含义与我们想要的出现偏差。
    vector的erase操作可以返回下一个有效的迭代器,所以只要我们每次执行删除操作的时候,将下一个有效迭代器返回就可以顺利执行后续操作了。比如像下面这样就可以:
vector<int> v{ 1, 2, 3,4,5 };
auto it = v.begin();
while (it != v.end())
{
    if (*it % 2 == 0)
        it = v.erase(it);
    else
        ++it;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值