sort定义在algorithm头文件里,它是一个模板
#include<bits/stdtr1c++.h>
using namespace std;
int main(){
int a[]={5,4,3,2,1};
sort(a,a+5);//传入排序需要排的左指针和右指针,默认是从小到大来排序
for(int i=0;i<5;i++){
cout<<a[i]<<" ";
}
cout<<endl;
// 输出:1 2 3 4 5<\n>
return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
//sort排序的自定义比较函数
int cmp(int x,int y){
return x>y;//从大到小来排序
}
int main(){
int a[]={1,2,3,4,5};
sort(a,a+5,cmp);//sort函数 变成了这个东东
for(int i =0;i<5;i++){
cout<<a[i]<<" ";
}
//输出:5 4 3 2 1
return 0;
}
greater<element_type>()
从大到小排序less<element_type>()
从小到大排序greater_equal
大到小,等于不交换less_equal
小到大,等于不交换iostream
里结构体的排序
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int x,y;
};
int main(){
node a[3];
a[0].x=1;
a[0].y=2;
a[1].x=2;
a[1].y=1;
a[2].x=3;
a[2].y=0;
sort(a,a+3);//这样编译过不了,因为不知道如何比较
sort(a,a+3,cmp);//方案1
for(int i=0;i<3;i++){
printf("%d %d\n",a[i].x,a[i].y);
}
return 0;
}
解决方案1.函数;
int cmp(node a,node b){
return a.x<b.x;//按照 x从小到大来排序
}
解决方案2.pair(pair提供了比较函数,但是不知道 按照什么排序)
解决方案3.重载运算符
1.结构体里定义函数
struct node{
int x,y;
void input()//直接调用即可,在结构体里面可以把x和y看做全局变量
{
scanf("%d%d",&x,&y);
out();//结构体里的成员他是没有先后次序的。
}
void output(){
printf("x=%d y=%d\n",x,y);
}
}
int main(){
node a;
a.input();
return 0;
}
这个程序是无限循环的
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
using namespace std;
struct spin{
int x,y;
void f(){
puts("This is the function f().");
g();
}
void g(){
puts("This is the function g().");
f();
}
};
int main()
{
spin x;
x.f();
return 0;
}
重载函数
void fun(int x,int y){
cout<<x<<' '<<y<<"hello"<<endl;
}
void fun(int x){
cout<<"world"<<x<<endl;
}
int main(void){
fun(1);//调用fun(int,int)
fun(1,2);//调用fun(int)
//注意:函数的参数的个数 不能一样!(哪怕不是一个类型的)
return 0;
}
运算符重载
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct no{
int x,y;
bool operator<(const no&cmp)const{
return x<cmp.x;
}//这就是刚刚写的运算符重载,sort也可以用
};
int main(){
no n[]={1,4,2,3};
sort(n,n+4);//编译通过!
for(no x:n){//C++的另一个知识:枚举每一个数组里的元素可以這麼枚举
cout<<x.x<<' ';
}
cout<<endl;
return 0;
}
结构体外的重载运算符
no operator+(no a,no b){
no t;
t.x=a.x+b.x;
t.y=a.y+b.y;
return t;
}
int main(){
node a,b,c;
a.in();
b.in();
c=a+b;
c.out();//自己写in和out函数
return 0;
}
当然,cin的>>,cout的<<,都可以重载,但是没有意义,还会导致一些神奇 的错误,就看你愿不愿弄!
C++11可以重载的运算符表
2. 类
和struct基本相似,但是有public,private,protected
三种状态