前言
参考博客
最近写如下代码后
std::vector<int> myVector{ 4, 19, 6, 24, 21, 1, 1 };
std::sort(myVector.begin(), myVector.end(), [](int first, int second) {
return first >= second;
});
for (int i : myVector)
{
std::cout << i << std::endl;
}
return 0;
程序直接触发一个断言,提示invalid comparator
。查找原因最终发现是因为,对于sort
的第三个参数要求的函数必须是 strict weak ordering
。修改也很简单将
first >= second
修改为
first > second
即可。
具体原因查看参考博客。
其它收获
断言
对于 assert(expression)
常常记不清楚,是expression成立(true)触发断言还是expression不成立(false)触发断言。其实看源码一目了然
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
所以当 expression
为 false
时,会执行 _wassert()
函数,就会触发断言。
C\C++调试常用的宏
#include <iostream>
int main()
{
std::cout << __FUNCTION__ << std::endl;
std::cout << __LINE__ << std::endl;
return 0;
}
__FUNCTION__
代表此宏所在的函数名称
__LINE__
代表此宏所在的行数
目前来说这两个宏好像不需要什么特别的头文件支持,可以直接使用。