1.有关于输出字符串时,scanf、rintf和cin、cout的区别
scanf(“%c”, )注意用scanf读入字符型数据时,会将最后的回车也算上,导致读入错误,在读入字符型数据时尽量使用cin
printf输出字符串是针对char *的,换言之,printf只能输出C语言中的内置数据,string不是c语言内置数据。
更深入的来说:s这个string类型的对象并非单单只有字符串,其内还有许多用于操作的函数,于是&s并非
字符串“Hello”的首地址,而是s这个对象的首地址。
此时就需要用到c_str()方法:返会当前字符串的首地址。
string s = "Hello";
printf("%s", s);
// 这样输出s会导致乱码,因为s不是首地址,需要用c_str()成员方法返回当前字符串的首字符地址
代码修改为:
printf("%s", s.c_str());
//这样即可输出Hello
//或者输出字符串时直接用cout<<s
2.当需要用到一个数字的长度时,可以使用库函数to_string将数字转化为string类型再size()
int i = 5000;
int len = to_string(i).size;
//能够得到len = 5
3.cin cout和scanf printf的速度比较
cin、cout是在编译期间就决定了读入变量的类型。而scanf()是在运行期决定的,编译器无法优化,而且还要识别字符串。理论上scanf比cin要慢很多,实际上快的原因是很多编译器对cin、cout的处理过于保守。因此理论上前者应该更快,但是由于编译器的处理导致实际上后者更快。总结的建议是:在OJ上做题时尽量使用scanf和printf更为靠谱。
4.血淋淋的教训:最后输出的变量在定义时一定要在全局变量,或者局部变量时一定要赋初值
局部变量不初始化时值是不确定的,可能会导致最后答案出错都不知道问题在哪
5.sort()函数用法
sort()函数左闭右开,即sort(a, b), a为要排序的第一个数的下标,b为要排序的最后一个数的下一个数的下标。
sort默认正序
若要实现从大到小排列,则可以用
sort(a, b, greater<int>);
即可实现倒序
正序中第三个参数为
sort(a, b, less<int>);
//自创排序规则:
//sort函数可以自定排序规则进行排序
int w[N],s[N];//w为数字数字,s[N]为每个数字的各位之和
sort(w, w + n,[&](int a,int b){ //数组中最好加一个引用,否则有可能只是复制该数组,并没有改变该数组
if(s[a] != s[b]) return s[a] < s[b];
else return a < b;
})
//意思即为,如果各位数字之和不等时,即按各位数字之和大小排序
//如果各位数字之和相等,即按数字本身大小排序
6.求数组长度函数
1.字符串数组:strlen(s);
2.数字数组:sizeof(arr) / sizeof(int);
3.其他容器长度:见常用c++STL
7.哈希表和pair数组的区别
#include<unordered_map>
哈希表:
unordered_map<int,int> res;
哈希表没有first和second操作,res[i] ++,代表的是将键为i的元素值+1,res.first++为非法操作
pair数组:
pair<int,int> p;
pair数组无法访问下标操作,p.first ++表示将第一个元素自增,second不变,res[i]++为非法操作
8.优先队列(模拟堆操作)
#include<queue>
typedef pair<int,int> PII;
priority_queue<PII, vector<PII>, greater<PII>> q[N]
//这是定义了一个优先队列数组,每个数组元素类型是PII,底层容器为vector,按照第一个元素从小到大排列
相关题目:acwing.3492.负载均衡