刷题总结

一、单词

lexicographically 字典序地
quota 配额

二、命名规则

一般性规则:具有描述性,使用众所周知的缩写

  1. 类型:(类、结构体等)单词首字母大写,不含下划线。枚举类型值用常量形式。
  2. 变量:全小写+下划线
  • 类的成员变量:以下划线结尾
  • 全局变量:g_前缀
  1. 常量:前缀k,首字母大写,不含下划线。避免使用宏。
  2. 函数:单词首字母大写,不含下划线。

三、典型错误

0、仍有疑问的错误

  • A1080
bool MyComp(Applicant a, Applicant b) {
	if (a.final_grade_ == b.final_grade_) {
		return a.exam_grade_ > b.exam_grade_;
		//return a.exam_grade_ >= b.exam_grade_;
		//error:incompatible operator ???
	}
	else {
		return a.final_grade_ > b.final_grade_;
	}
}

1、迭代器作返回值

end()是一个不确定的值,不能从函数返回值取回来再作比较。

//错误示例
vector<int>::ierator FuncA(vector<int> a){
	return a.end();
}
void FuncB(){
	vector<int>::ierator it = FuncA;
	if(it == a.end())
		...
}

v.rbegin()reverse_iterator类型,不能赋值给iterator类型。可以用v.end() - 1

2、erase()函数的使用

  1. 返回值是被删除元素后一位的迭代器。并且返回值要赋给遍历用的迭代器,否则迭代器会变成野指针。
  2. 遍历用的迭代器在调用erase()后,相当于已经后移了一位,所以迭代器递增的条件不能放在for语句中。
for (auto it = v.begin(); it < v.end();) {
		if (...)
		{
			it = v.erase(it);
		}
		else ++it;
}

3、二维vector未初始化就使用operator[]

/****
 *	ERROR:
 *		vector<vector<int>> v
 *		v[index] = value;
****/

内层事实上还没有元素,不能用运算符[]来访问元素。
A1080题中,预先知道外层vector大小,所以先v.resize(len)即可。

4、vector的填充构造函数

vector(size_type n, const value_type & val, const allocator_type & alloc = allocator_type());
填充方式的vector构造函数第一个参数指明填充个数,第二个才是要填充的值。
A1080中使用了vector<int> v(-1),所以引发了abort()已被调用的严重错误。

5、二维vector排序错误

vector<vector<int>> v;
for (auto it = v.begin(); it < v.end(); ++it) {
		sort((*it).begin(), (*it).end());
	}
/***error
for (auto i : v)
	sort(i.begin(), i.end());
***/

事实上是要对内层的每个vector<int>排序,而错误写法是要对vector排序,这显然是行不通的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值