vector
是C++ STL中的一个动态数组类库,支持随机访问。与Java中的ArrayList
类似。
#include
using namespace std;
与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
库可以使用greater
和less
,它们分别表示降序和升序。注意尖括号中的泛型要写对类型。
有时候需要升序降序之外的比较逻辑,因此需要自定义比较器[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))
参考菜鸟教程 ↩︎
参考博文《从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法》 ↩︎
参考博文《C++ STL标准模板库vector的求长度size()-1的一个小坑》 ↩︎
参考博文《vector.size()-1引发的错误》 ↩︎