scanf(“%d-%d %d”,&t1,&p1,&g1); 格式限定
%lld 表示对long long型的数据类型进行读取
scanf(“%s”,&ch),死活过不去就把ch弄成char ch[] 数组类型,然后直接赋值给字符串即可
利用字符读取,直到出现回车结束
char c = getchar();
for(int i = 0; c != '\n'; i++){ //输入字符串
str[i] = c;
c = getchar();
}
==========================================================
字符串拼接时候需要注意
char c = 's';
//不允许这种方式
string s1 = "asd"+c;
//这种拼接方案可以使用
s1 = s1 + c;
==========================================================
if (scanf(“%d/%d %d/%d %d”, &a, &b, &c, &d, &fenmu)) {}; 防报错
==========================================================
printf(“%03d”,j); 控制输出
==========================================================
printf(“%.5f”,j); 小数点保留位数
这样也可以做到连续读取字符串和数字
scanf(“%d%s%s”, &n, a, b);
char a[10000] 数组接受的字符串 长度计算可以使用strlen(a)
==========================================================
#include< iomanip >|| fixed << setprecision(1) << it->second;
cout<<" " << setprecision(1) << setiosflags(ios::fixed) << v1[i + 1];
这种写法叫精确到某一位,即便v1[i+1]为6.0000整数情况也可以保存下来一位0。但是这么写的弊端就是后面cout都会变成一位小数。
cout << setprecision(1) << fixed << it ;
这样写就不会导致后面的输入抑制变化了,这种写法好像对于vector容器会一直输出
==========================================================
printf(“%s:”, string1.c_str()); 使用c_str() 因为printf要求char*;
==========================================================
getline(cin,s1) 使用该函数的时候要注意上边函数cin是否换行完成
若没有则需要使用char ch=getchar()来消掉
==========================================================
==========================================================
常用于C++中Map容器按key值进行排序,第二个const省略会报错
struct Cmp {
bool operator()(int k1, int k2)const {
return k1 > k2;
}
};
==========================================================
若是对map容器按照Value来进行排序,需要将map容器放置在vector容器当中,然后利用vector进行排序操作
`bool cmp(const pair<string, int>& a, const pair<string, int>& b) {
return a.second < b.second;
}// 将map中的内容转存到vector中
vector<pair<string, int>> vec(name_score_map.begin(), name_score_map.end());
//对线性的vector进行排序
sort(vec.begin(), vec.end(), cmp);
for (int i = 0; i < vec.size(); ++i)
cout << vec[i].first << endl;在这里插入代码片`
==========================================================
algorithm头文件下的transform函数使用
transform(school.begin(), school.end(), school.begin(), ::tolower);
==========================================================
numeric头文件下的accumulate函数
int sum = accumulate(vec.begin() , vec.end() , 42);
accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值
==========================================================
****常用于C++中unordered_map容器按key值进行排序,需要将其放入vector中进行排序 ****
vector<pair<int, double>> vec;//在该vector中进行sort排序
bool comp(const pair<int,double>& a, const pair<int, double>& b) {
return a.first > b.first;
}
==========================================================
vector<vector> vec(m, vector(n, 0));//初始化一个m行n列的元素值全为0的二维数组
遍历容器使用的操作
set<char>::iterator iter = temp1.begin();
while (iter!=temp1.end())
{
cout<<*iter;
iter++;
}
一、struct和class声明类型时,必须初始化后才能使用,初始化之前仅仅能够进行赋值而已;
==========================================================
二、对于一维和二维矩阵的赋值方式有:其中e是二维矩阵
fill(e[0], e[0] + 510 * 510, 9999);
fill(dis, dis + 510, 9999);
==========================================================
三、字符串直接换成进制输出
string out = “1A”;
int x = stoi(out, nullptr, 16);
cout << x <<endl;
int x;
stringstream ss;
ss << std::hex << “1A”; //std::oct(八进制)、std::dec(十进制)
ss >> x;
cout << x<<endl;
==========================================================
四、如果想要在创建数组的时候使用变量来定义,则需要使用以下方法
#define NODE_NUM 1001
int v[NODE_NUM][NODE_NUM];
==========================================================
四、在PAT当中,如果遇到输入一个就要输出一个的情况,我们可以同时运用输入和输出操作,不会影响到代码最后的运行结果
==========================================================
五、vector中移除特别值得操作
for (vector<Customer>::iterator it = in.begin(); it != in.end();) {
if (it->end == i) {
it = in.erase(it);
}
else {
++it;
}
}
==========================================================
六、优先队列就是一种堆结构,可以利用大顶堆和小顶堆性质去解决中位数问题
//小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//大顶堆
priority_queue <int,vector<int>,less<int> >q;
==========================================================
六、然而在C、C++和java中,e代表“10的次幂”。所以在C++或者JAVA中看到像1.39e-43f这样的表达式时,它真正的含义是1.39*10-43。
==========================================================
七、对于C++容器中的迭代器,find函数找到的一般返回是迭代器的位置。而find里面填的内容往往是具体数值,适用形式如下
multiset<int> s1;
s1.erase(s1.find(*s1.rbegin()));
==========================================================
八、lower_bound( begin,end,num):从begin位置到end-1位置二分查找第一个大于或等于num的数字,返回该数字的迭代器
==========================================================
九、C++与Java中如果数值类型溢出的话,就会反向回加,这就需要判断了,假如a+b溢出了。如果a<0且b<0,那么a+b>0时就是反向溢出值,但实际上若做出判断的话,是更小了的。
==========================================================
10、下面这种方式直接会在C++中创建好每一个位置的地址,这样就可以方便很多
class Node{
public:
int val;
Node* left;
Node* right;
Node(int val) {
this->val = val;
}
Node() {}
}s1[100];
==========================================================
11、若在栈或者队列等集合中放入自定义类对象,则需要根据以下形式传入地址 queue<Node|*> q1
==========================================================
12、strcmp函数:用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数,包含的库是#include<cstring>
==========================================================
13、map容器的删除操作
for (map<string, Node>::iterator iter = m1.begin(); iter != m1.end(); ) {
if (iter->second.weight <= k||iter->second.con.size()<2) {
iter=m1.erase(iter);
}
else {
iter++;
}
}
==========================================================
14、构造自定义优先队列
priority_queue< Node, vector<Node>, cmp1> q1;
struct cmp2 //此时weight小的优先级高
{
bool operator()(const Node &a, const Node &b)
{
return a.weight > b.weight;
}
};
==========================================================
15、获取答案的过程尽量不要使用erase的操作来获取
==========================================================
16、对于一些模拟链表类的题目来说,要注意存在结点是不属于这个链表的情况,并且对于模拟链表常常用以下方式进行遍历
for(int i = s; i != -1; i = node[i].next) {
node[i].flag = true;
cnt++;
}
==========================================================
16、greater和less的用法,相较于优先队列的使用也有一定程度的不同
sort(vec.begin(),vec.end(),greater<int>());//内置类型从大到小
sort(vec.begin(),vec.end(),less<int>()); //内置类型小大到大
==========================================================
17、cin和scanf读取的范围
如果读取的数溢出,cin得到的是最大值,而scanf得到的是溢出后的值
==========================================================
18、对于某些容易超时长的项目要注意使用技巧
1.第三个用map存储会超时,用unordered_map就不会超时啦~
2.排序传参建议用引用传参,这样更快,虽然有时候不用引用传参也能通过,但还是尽量用,养成好习惯~
==========================================================
19、随机获取参数
srand函数是随机数发生器的初始化函数;
当srand()的参数值固定的时候,rand()获得的数也是固定的,
故而一般使用无符号的time来进行赋值;
srand((unsigned)time(NULL));
int ran = rand() % (right - left + 1) + left;
==========================================================