一、单词
lexicographically 字典序地
quota 配额
二、命名规则
一般性规则:具有描述性,使用众所周知的缩写
- 类型:(类、结构体等)单词首字母大写,不含下划线。枚举类型值用常量形式。
- 变量:全小写+下划线
- 类的成员变量:以下划线结尾
- 全局变量:g_前缀
- 常量:前缀k,首字母大写,不含下划线。避免使用宏。
- 函数:单词首字母大写,不含下划线。
三、典型错误
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()函数的使用
- 返回值是被删除元素后一位的迭代器。并且返回值要赋给遍历用的迭代器,否则迭代器会变成野指针。
- 遍历用的迭代器在调用
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
排序,这显然是行不通的。