~( TロT)σ 小小年纪忘性怎么会这么大的呀,才学了不久怎么就都忘了呢,我是从什么时候开始学着不记事的呢??啊啊啊,习惯养成了呀,对所有的事都不在意,根本不过脑子,再好的理解力也赶不上惊人的忘记速率哎。。算了,可以培养出来的淡忘能力这真的不好改的,而且记太多事情很累的。就这样吧,记个笔记,忘记了回来再看吧,不怂,且行且看着就好。
这次的笔记是复习一下结构体的初始化,以及操作符的定义,还有就是记录一下刚学的sort函数compare的重载吧
结构体的定义及其成员的初始化。这是直接摘自我的实验报告。还好还好,我的实验报告写的还行,稍微再改改。程序啥意思不重要,就不解释了啊,反正也不难。
-
#include<stdio.h> #include<math.h> struct Vector2D{ double x,y; /*double x=0,y=0;进行初始化?nonono,it is wrong.因为:通常情况下,不应该在 类内部初始化成员!!无论是否为静态、是否为常量、是否为int等!!统统不建议在类 内初始化,因为本质上类只是声明,并不分配内存,而初始化会分配内存,类内初始化 会将两个过程混在一起!*/ //成员的初始化,若无初始参数,初始化为0 Vector2D (const double a=0,double b=0): x(a),y(b){} /*这个函数叫做构造函数,和它兄弟析构函数是没有声明类型和返回值的。构造函数 用来初始化自定义类型。其名称和结构体的名称一致。*/ //执行a=b,将b的值赋给a Vector2D (const Vector2D& a): x(a.x),y(a.y){} //计算两向量的数量积 double dot(Vector2D b){ double t; t=x*b.x+y*b.y; return t; } //计算向量的 模 double norm (){ double t; t=sqrt(x*x+y*y);//突然想起,曾经因为不知道传入sqrt的参数是double还头疼了许久呢 return t; } //计算两向量的夹角, cos=数量积 / 模之积 double angle(Vector2D other){ double a= dot(other)/norm ()/other.norm() ; //1e-9十的负九次方 /* 到这不得不说下abs()和fabs()了,一个是对整数取整,一个是对浮点数取整,浮点数转化为int时有精度 损失的 ,用的时候得注意下呀*/ if(fabs(fabs(a)-1)<1e-9)//double是有误差的 { if(a>0) a=1; else a=-1; } return acos(a);//反三角函数 } //+的重载 /*为什么要重载操作符呢?因为操作符真的很好用啊,简洁明了。但对于自己定义的数据类型, 原本操作符就么用了。这时候就可以重载下操作符,告诉计算机,对于自己定义的这个数据类 型,某个操作符是什么意思。这个函数的重载差不多,重载后操作符还是原来的样子,但是添 加了一个副本,使用是通过参数来判断用原来的版本还是用新添的副本*/ Vector2D operator + (Vector2D other){ Vector2D temp(x+other.x,y+other.y); return temp; } }; int main(){ Vector2D a(4.0,3.0);//诺,这个是初始化参数为4.0,3.0 Vector2D b;//无初始化参数 b=a; for(int i=0;i<2;++i){ scanf("%lf %lf %lf %lf",&a.x,&a.y,&b.x,&b.y); printf("%f\n",b.angle(a)*180/3.141592659); } return 0; }
----分割线----------------------------------------------------------------------------------------------------------------------------------------------------------------------
sort函数的使用:
sort可以传两个参数,第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。
比如要对a[i]->a[j]排序 ,sort(a+i,a+j),;
这个很好理解的,下面说下三个参数的sort()。前两个参数的意义和上面相同,第三参数呢是比较函数。比较函数是一个自己定义的函数,返回值是bool型,规定什么样的关系是“<”。
来两个栗子;
sort()可以进行降序排序
bool cmp(int x,int y){
return a>b;
}
sort(a,a+n,cmp);
栗子二:也不说啥题意了,直接上题目好了
chika很喜欢吃蜜柑。每个蜜柑有一定的酸度和甜度,chika喜欢吃甜的,但不喜欢吃酸的。
一共有n个蜜柑,chika吃k个蜜柑,将获得所吃的甜度之和与酸度之和。chika想获得尽可能大的甜度总和。如果有多种方案,她希望总酸度尽可能小。
她想知道,最终的总酸度和总甜度是多少?
【输入】
第一行有两个正整数n和k,分别代表蜜柑总数和chika吃的蜜柑数量。(1≤k≤n≤200000)
第二行有n个正整数ai,分别代表每个蜜柑的酸度。(1≤ai≤1e9)
第二行有n个正整数bi,分别代表每个蜜柑的甜度。(1≤bi≤1e9)
【输出】
两个正整数,用空格隔开。分别表示总酸度和总甜度。
【样例输入】
3 2
1 3 4
2 2 5
【样例输出】
5 7
解法:把甜度从高到低排序,同时甜度相等按酸度降低排序
怎么排序呢,冒泡?好像就对这个熟一点,但看数据范围,冒泡一定会超时的吖。其他排序只知道个名字,所以还是直接调sort吧
-
#include <stdio.h> #include <iostream> #include <string> #include <math.h> #include <algorithm> using namespace std; struct point { long long x,y;//x 为酸度,y为甜度 point (const long long a=0,long long b=0):x(a),y(b){} }; bool cmp(point s,point c){ if(s.y==c.y) return s.x>c.y;//甜度相同,按酸度降序排序 else return s.y<c.y;//甜度升序 } int main() { int n,k; cin>>n>>k; point a[n];//c++允许这样做,c不允许 for(int i=0;i<n;++i) cin>>a[i].x; for(int i=0;i<n;++i) cin>>a[i].y; sort(a,a+n,cmp); point te;//注意哦,te的x,y是已经被初始化为0的 for(int i=n-1;i>=n;--i){ te.x+=a[i].x,te.y+=a[i].y; } cout<<te.x<<' '<<te.y<<endl; return 0; }