【C、C++】ctype.h、cctype中的isnumber()函数和isdigit()函数的区别

Mac OS X 手册页上ctype函数中对isnumber()和isdigit()函数的区别是这样解释的:

The isnumber() function behaves similarly to isdigit(), but may recognize additional characters, depending on the current locale setting. 

也就是说:isnumber()函数与isdigit()相似,但isnumber()可能会识别其他字符,具体取决于当前的区域设置~

在XCode或者CLion(Mac版)的ctype.h(或者cctype)中可能会见到isnumber()函数,然而查阅C++官方文档却找不到,这是因为isnumber()并不是C/C++的官方库函数,而是Apple特地为Mac OS的C++添加的它认为好用的一些函数(这些函数有很多,不止isnumber)。可以查看Mac OS X Man Pages中ctype函数页找到isnumber()函数~手册中也提到isnumber()并不在C90标准中:

These functions, except for digittoint(), isascii(), ishexnumber(), isideogram(), isnumber(), isphonogram(), isrune(), isspecial() and toascii(), conform to ISO/IEC 9899:1990 (ISO C90”).

可以看到如果使用isnumber()函数在Linux环境下g++是无法编译通过的:

在Clang下也是无法编译通过的:

所以isnumber()并不是标准的C/C++库函数,如果是刷算法的时候还是不要使用哦~

【C++】max_element() 和 min_element()

0. 在头文件 #include <algorithm> 中,返回的是迭代器,所以输出值的话要在前面加 *

1. 第三个参数cmp可写可不写, max_element() 和 min_element() 默认是从小到大排列,然后 max_element() 输出最后一个值, min_element() 输出第一个值,但是如果自定义的 cmp 函数写的是从大到小排列,那么会导致 max_element() 和 min_element() 的两个结果是对调的

2. 可以用于 vector<int> 或者 vector<string> 等,也可以用于 int arr[4] 或者 string arr[4] ,也可以用于结构体vector或者结构体数组~

【C++】accumulate函数的用法(STL)

在头文件 #include <numeric> 里(但是我用的时候在PAT里面不写头文件似乎也没关系……)

主要是用来累加容器里面的值,比如int、string之类,可以少写一个for循环

比如直接统计 vector<int> v 里面所有元素的和:(第三个参数的0表示sum的初始值为0)

int sum = accumulate(v.begin(), v.end(), 0);

比如直接将 vector<string> v 里面所有元素一个个累加到string str中:(第三个元素表示str的初始值为空字符串)

string str = accumulate(v.begin(), v.end(), "");

 

int输出%f浮点值是0,double/float 浮点数%d输出0的原因

输出为:

  • int输出%f浮点值的时候,比如2,2内部表示如果看作是float,是个很小的数所以输出的是0.000000
  • double/float 浮点数按照%d输出,如果输出为0,则说明a的数据放在地址的高端,而整型比浮点数内存中占的字节数少,整型只会把属于它的字节数读出来,如在Win32,VC6.0下,Int是4位,它就会把从a开始的4位读出来(按整型格式),所以它把浮点数低端地址的0给输出出来。
  • 所以说使用printf的时候数据格式一定要对应,或者使用printf("%d", (int)a);这样强制转换的方法输出不同格式的数据

【C/C++】全局变量只能初始化不能赋值

  • C/C++中,全局变量只能声明、初始化,而不能赋值
  • 也就是说,下面这样是不被允许的:

  • 错误提示是:
  • 声明、初始化与赋值的区别:
    • 声明:int a;
    • 初始化:int a = 2;(在声明的时候顺带赋值叫做初始化)
    • 赋值:a = 2;
  • 只有定义(int a;)才分配存储空间,初始化必须要有存储空间来初始化
  • 全局变量在声明时候顺带赋值(也就是初始化)是可以的,但是如果先声明,不赋值,之后再赋值的话,程序是执行不到这里的,也无法通过编译。

【C++】判断两个vector是否相等~直接用“==”

  • 如果vector里面的元素类型是简单类型(内置类型),可以直接使用“==”或者“!=”进行比较
  • 甚至可以使用“<=” “<” “>=” “>”比较两个vector大小:按照字典序排列