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引发的错误》 ↩︎

猜你喜欢

转载自blog.csdn.net/Mr_Megamind/article/details/106179723
今日推荐