前言
记录一些C++刷编程题中容易报错且忽视的Tips记录
1.
for循环中i < v.size() - 1
判断语句,语句右边的v.size() - 1
应该保证为≥ 0
,若为负数,会自动转变为无符号整数
,导致for
继续循环继而报错。
例如-1
会溢出为18446744073709551615
,为2^64 - 1
。
2.
** 问题描述:**
排序函数sort(v.begin(), v.end(), cmp)
的cmp
比较函数里不要写<=
或>=
,数据量大的情况下可能会报空指针null pointer
错:
终端报错信息:
``Line 1034: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:9
3.
问题描述:
unordered_set使用<pair<int, int>作为Key值编译会报错!
报错信息:
Line 55: Char 17: error: call to implicitly-deleted default constructor of 'Solution'
int ret = Solution().movingCount(param_1, param_2, param_3); return ret;
^
Line 3: Char 35: note: default constructor of 'Solution' is implicitly deleted because field 'st' has a deleted default constructor
unordered_set<pair<int, int>> st;
^
报错原因:
unordered_set 无法处理 pair<int, int> 型数据,需自己定义适用于 pair 类型的哈希函数
解决办法:
1. 使用 set<pair<int, int>> st;
2. 使用 unordered_set<pair<int, int>, pair_hash> st;
struct pair_hash {
size_t operator() (const pair<int, int>& p) const {
return p.first ^ p.second;
}
};