ACM省赛推迟了,原因是主办方山大的疫情出了点状况。
深度学习一下C++的一些基础的东西,介绍学习一些C++的许多头文件。
传统的C和C++中的像特别熟悉的头文件iostream,stdio,stdlib,string,就不详细说了,还有做题用处不太大的像limits,time这些也不说了,传统的头文件介绍三个:
1、#include
//#define NDEBUG #include#include int main() { double a,b; scanf("%lf%lf", &a, &b); printf("a=%f, b=%fn",a,b); assert(b != 0); printf("%lf/%lf=%lfn",a,b,a/b); return 0; }
看这段代码,如果输入a = 6, b = 3,程序正常运行:
当输入被除数b=0时,抛出错误信息:
当然,如果没有assert,程序不报错,但会出现结果错误的情况:
此外还可以判断malloc分配内存失败,返回NULL,assert可以用于检测指针是否NULL
2、#include
isalpha() 如果参数是字母,该函数返回真。
isdigit() 如果参数是数字(0~9),该函数返回true。
islower() 如果参数是小写字母,该函数返回true。
isupper() 如果参数是大写字母,该函数返回true。
tolower() 如果参数是大写字符,则返回其小写,否则返回该参数。
toupper() 如果参数是小写字母,则返回其大写,否则返回该参数。
如下代码:
#include#include int main() { char a1 = '1'; char a2 = 'c'; char a3 = 'A'; if(isalpha(a2)) printf("a2是字母.n"); else printf("a2不是字母.n"); if(isdigit(a1)) printf("a1是数字.n"); else printf("a1不是数字.n"); if(islower(a2)) printf("a2是小写字母.n"); else printf("a2不是小写字母.n"); if(isupper(a3)) printf("a3是大写字母.n"); else printf("a3不是大写字母.n"); printf("%cn",tolower(a3)); printf("%cn",toupper(a2)); return 0; }
3、#include
setw(n),setw表示预设的宽度
setfill(char c),setfill表示前边的空白填充
setbase(int n),setbase表示几进制输出
setprecision(n),setprecision表示输出几位浮点数
示例:
#include#include using namespace std; int main() { cout << setw(5) << 123.123 << endl; cout << setw(10) << 123.123 << endl; cout << setfill('%') << setw(10) << 123.123 << endl; cout << setbase(16) << setw(1) << 10 << endl; cout << setprecision(5) << 1.234567 << endl; }
标准C++:比起传统的头文件,标准C++提供的头文件更加丰富,用处更加多彩。
我们来简单介绍一些这些头文件以及常用的函数:
#include:algorithm意为算法,是C++的标准模板库STL中最重要的头文件之一,提供大量基于迭代器的非成员模板函数。
其中函数特别好用,例如:
(1)reserve()反转,可以是数组,也可以是vector容器:
#include#include using namespace std; int main() { int a[10]={1,2,3,4,5,6,7,8,9,10}; reverse(a,a+10); for(int i=0;i<10;i++) cout << a[i] << " "; return 0; }
#include#include #include using namespace std; int main() { vector a; for(int i=0;i<10;i++) a.push_back(i); reverse(a.begin(), a.end()); for(vector ::iterator it=a.begin();it!=a.end();++it) cout << " " << *it; return 0; }
(2)next_permutation(),返回大于等于当前序列的全排列:
#include#include using namespace std; int main() { int a[10] = {1, 3, 5}; cout << a[0] << " " << a[1] << " " << a[2] << endl; while(next_permutation(a, a+3)) { cout << a[0] << " " << a[1] << " " << a[2] << endl; } return 0; }
(3)sort()排序函数,这个不用的多说了吧,很高效好用的排序函数,再多说一点,默认升序排序,如果想要降序在第三个参数上写greater
#include#include using namespace std; int main() { int a[10] = {1, 3, 5}; sort(a,a+3,greater ()); cout << a[0] << " " << a[1] << " " << a[2] << endl; return 0; }
#include
bitset:可以把整数转换成为二进制数。
reset:清零所有二进制位。
set:把第几个字符改成0或1。
to_string:转换成字符串。
to_ulong:转换成无符号整数。
示例:
#include#include using namespace std; int main() { int a = 10; bitset<10>b(a); cout << b << endl; b.set(3,0); cout << b << endl; string str = b.to_string(); cout << str << endl; int data = b.to_ulong(); cout << data << endl; b.reset(); cout << b << endl; return 0; }
#include
#include#include using namespace std; int main() { complex z(2, 3); complex z1; complex z2(z); cout << z << endl; cout << z1 << endl; cout << z2 << endl; z.real(4); z.imag(5); cout << z << endl; cin >> z1; cout << z1 << endl; return 0; }
!!再打complex时,发现一个关键字compl,他就是运算符~,可以按位取反。( 狗头
#include
q.size():返回双端队列大小。
q.empty():返回双端队列是否为空。
q.clear():清空容器。
q[i]:像vector一样随机访问。
q.begin()/q.end():返回首迭代器/尾迭代器。
q.front()/q.back():返回队头/队尾元素。
q.push_front(x)/q.push_back():在队头/队尾插入元素x。
q.pop_front()/q.pop_back():弹出队头/队尾元素
#include#include using namespace std; int main() { deque q; q.push_front(1); q.push_back(2); q.push_front(3); cout << q[1] << endl; cout << q.size() << endl; cout << q.front() << endl; cout << q.back() << endl; q.pop_back(); q.pop_back(); q.pop_back(); cout << q.size() << endl; return 0; }
#include:链表结构,快速的插入和删除操作,随机访问却比较慢,主要函数:
push_back():在后面插入数据。
push_front():在前面插入数据。
front():返回第一个数据。
back():返回最后一个数据。
pop_back():删除最后一个元素。
pop_front():删除第一个元素。
size():返回元素个数。
sort():排序。
reverse():反转。
示例:
#include#include using namespace std; int main() { list
a, b; cout << a.empty() << endl; a.push_back(1); a.push_back(3); a.push_front(5); cout << a.front() << endl; a.sort(); cout << a.front() << endl; a.pop_front(); cout << a.front() << endl; return 0; }
#include
#include#include
#include
push():元素入队。
pop():元素出队。
front():取对头元素。
back():取队尾元素 。
empty():判断队列是否为空。
size():返回队列的大小。
示例:
#include#include using namespace std; int main() { queue q; q.push(1); q.push(2); q.push(3); cout << q.size() << endl; cout << q.front() << endl; q.pop(); cout << q.front() << endl; q.pop(); cout << q.front() << endl; q.pop(); cout << q.empty() << endl; return 0; }
#include
insert():插入元素。
count():返回元素出现的个数。
size():集合中元素个数。
empty():判断集合是否为空。
#include#include using namespace std; int main() { set s; s.insert(3); s.insert(1); s.insert(5); cout << s.count(1) << endl; cout << s.size() << endl; cout << s.empty() << endl; for(set ::iterator it = s.begin();it!=s.end();++it) cout << *it << " "; return 0; }
#include
push():元素入栈。
pop():元素出栈。
size():返回栈中元素个数。
empty():判断栈是否为空。
top():访问栈顶元素。
示例:
#include#include using namespace std; int main() { stack st; st.push(1); st.push(2); st.push(3); cout << st.empty() << endl; cout << st.size() << endl; cout << st.top() << endl; st.pop(); cout << st.top() << endl; st.pop(); cout << st.top() << endl; st.pop(); return 0; }
#include
push_back():在数组最后插入一个数据。
size():返回数组数据个数。
empty():判断是否数组为空。
[i]:返回位置为i的元素。
b=a:给b容器赋值a。
b==a:判断是否数组内元素全相等。
示例:
#include#include using namespace std; int main() { vector a; a.push_back(3); a.push_back(5); a.push_back(1); cout << a.size() << endl; cout << a.empty() << endl; cout << a[1] << endl; vector b; if(a==b) cout << 1 << endl; else cout << 0 << endl; b = a; if(a==b) cout << 1 << endl; else cout << 0 << endl; return 0; }



