PAT C++ 刷题日记

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;

==========================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值