C++学习笔记(二)——vector库篇

vector是什么?

vector是C++ STL中的一个动态数组类库,支持随机访问。与Java中的ArrayList类似。


如何引入vector库?

#include<vector>
using namespace std;

如何创建一个vector?

与Java中的ArrayList类似,使用泛型创建一个可以存储特定类型数据的vector。

vector<int> nums;

如以上代码,创建一个int型的vector。


常用方法

以下是vector的一些常用成员方法[1]

插入元素

// 向末尾添加一个元素
void push_back(const T& x)

删除元素

// 删除末尾的元素
void pop_back()

// 清空所有元素
void clear()

访问元素

// 返回pos位置元素的引用
reference at(int pos)

// 返回首元素的引用
reference front()

// 返回尾元素的引用
reference back()

// 数组式的访问方式
nums[index]

修改元素

// 设置第n个元素的值为x
void assign(int n,const T& x)

// 数组式的修改方式
nums[index] = newValue;

求大小

unsigned int size() const

需要注意的是:这里的返回值类型为unsigned int,即无符号整型。

判空

// 判断是否为空
bool empty() const

// 通过当前大小
if (nums.size() == 0)

二维数组

vector<vector<int>> nums;

排序

对vector进行排序,需要引入algorithm库,调用其sort方法。

// 默认升序排序
sort(nums.begin(), nums.end());

// 降序排序方法
sort(nums.begin(), nums.end(), greater<int>());

// 另一种升序排序方法
sort(nums.begin(), nums.end(), less<int>());

sort的三参重载可以传入比较方法,类似于Java中的Comparator比较器。引入functional库可以使用greaterless,它们分别表示降序和升序。注意尖括号中的泛型要写对类型。


自定义排序

有时候需要升序降序之外的比较逻辑,因此需要自定义比较器[2]

较为复杂的结构体

struct s
{
	int a, b;
};

自定义比较器

注意,返回值为true的条件表示s1排在s2前面的条件。

bool comparator(const s &s1, const s &s2)
{
	return s1.a > s2.a;
}

使用自定义比较器排序

重新定义一个存放结构体s的vector

vector<s> sVector;

排序

sort(sVector.begin(), sVector.end(), comparator);

实践中遇到的一个坑

当vector为空时,一个常规的判断

if (0 < nums.size() - 1)

预期结果为假,但实际运行结果为真。

经过调试发现,是nums.size() - 1得到了一个出乎意料的结果,输出显示其为4294967295,即2^32-1

究其原因,vector的size方法返回值类型为无符号整型,实际上是做0 + (-1)运算,由于负数通过补码存储,-1的二进制表示为11111111 11111111 11111111 11111111,与0求和仍为32个1,转换为10进制即为4294967295[3]

解决方案

将计算结果强制转换为有符号整型[4]

if (0 < (int)(nums.size() - 1))

  1. 参考菜鸟教程 ↩︎

  2. 参考博文《从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法》 ↩︎

  3. 参考博文《C++ STL标准模板库vector的求长度size()-1的一个小坑》 ↩︎

  4. 参考博文《vector.size()-1引发的错误》 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMplementist

你的鼓励,是我继续写文章的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值