ACM省赛推迟了,原因是主办方山大的疫情出了点状况。
深度学习一下C++的一些基础的东西,介绍学习一些C++的许多头文件。
想要了解C/C++常用函数,参考这篇: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=%f\n",a,b);
assert(b != 0);
printf("%lf/%lf=%lf\n",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("%c\n",tolower(a3));
printf("%c\n",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
其中函数特别好用,例如:
(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<int> a;
for(int i=0;i<10;i++)
a.push_back(i);
reverse(a.begin(), a.end());
for(vector<int>::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<int>());
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<double>z(2, 3);
complex<double>z1;
complex<double>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<int> 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<int> 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
using namespace std;
int main()
{
map<string, int> mp;
mp["aaa"] = 100;
mp["bbb"] = 200;
mp["ccc"] = 300;
for(map<string, int>::iterator it = mp.begin();it!=mp.end();++it)
cout << (*it).first << ":" << (*it).second << endl;
cout << mp.count("aaa") << endl;
cout << mp.empty() << endl;
cout << mp.size() << endl;
return 0;
}
#include
push():元素入队。
pop():元素出队。
front():取对头元素。
back():取队尾元素 。
empty():判断队列是否为空。
size():返回队列的大小。
示例:
#include
#include
using namespace std;
int main()
{
queue<int> 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<int> 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<int>::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<int> 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<int> 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<int>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;
}