多关键字排序(里面有关于操作符(<<运算符 和 >>运算符 )的重载)

一种排序

时间限制:3000 ms | 内存限制:65535 KB

难度:3

描述
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);
1.按照编号从小到大排序
2.对于编号相等的长方形,按照长方形的长排序;
3.如果编号和长都相同,按照长方形的宽排序;
4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;

输入
第一行有一个整数 0<n<10000,表示接下来有n组测试数据; 每一组第一行有一个整数 0<m<1000,表示有m个长方形; 接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,
第二个和第三个数值大的表示长,数值小的表示宽,相等 说明这是一个正方形(数据约定长宽与编号都小于10000);
输出
顺序输出每组数据的所有符合条件的长方形的 编号 长 宽
样例输入
1
8
1 1 1
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
样例输出
1 1 1
1 2 1
1 2 2
2 1 1
2 2 1
my answer:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX = 100000;
typedef struct cil{
    int s;
    int l;
    int w;
    bool flag;
}cil;
cil a[MAX];
int  compare(cil a, cil b)
{
    if(a.s != b.s ) return a.s < b.s;
    if(a.l != b.l ) return a.l < b.l;
    if(a.w != b.w ) return a.w < b.w;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int m;
        cin>>m;
        for(int i = 0; i < m; i ++){
            cin>>a[i].s>>a[i].l>>a[i].w;
            if(a[i].l < a[i].w ) swap(a[i].l,a[i].w);
            a[i].flag = 1;
        }
        sort(a,a+m,compare);
        for(int i = 0; i < m; i ++)
        {
            if(i != 0&& a[i].s == a[i-1].s&&a[i].l == a[i-1].l &&a[i].w == a[i-1].w) a[i].flag=0;
        }
        for(int i = 0; i < m; i++)
        {
            if (a[i].flag)
             cout<<a[i].s<<" "<<a[i].l<<" "<<a[i].w<<endl;
        }
    }
    return 0;
}

参考高手代码:

#include<iostream>
#include<set>
#include<iterator>
using namespace std;
struct Rect
{
    int num,length,width;

};
bool operator<(const Rect& r1,const Rect& r2)
{
    return r1.num<r2.num || r1.num==r2.num && r1.length<r2.length ||r1.num==r2.num&&r1.length==r2.length &&r1.width<r2.width;
}
istream& operator>>(istream& in,Rect& r)
{
    in>>r.num;
    int a,b;
    cin>>a>>b;
    r.length=max(a,b);
    r.width=min(a,b);
    return in;
}
ostream& operator<<(ostream& out,const Rect& r)
{
    return out<<r.num<<" "<<r.length<<" "<<r.width;
}
int main()
{
    int num;
    cin>>num;
    while(num--)
    {
        set<Rect> rs;
        Rect r;
        int n;
        cin>>n;
        while(n--)
        {
            cin>>r;
            rs.insert(r);
        }
        copy(rs.begin(),rs.end(),ostream_iterator<Rect>(cout,"\n"));
    }
}  
关于操作符的重载的学习:
1.输出操作符〈〈的重载:
//为了与IO标准库一致,操作符应接受ostream&做为第一个形参,对类类型const对象的引用作为第二个形参,并返回对ostream形参的引用。
ostream& operator <<(ostream& os , const Rect& r )
{
	os << //....
	return os;
}
示例:
对一个 Sales-iterm类进行重载输出操作符
<pre name="code" class="cpp">ostream& operator <<(ostream& out , Sales_iterm& s)
{
	out<<s.isbn<<"\t"<<s.units_sold<<"\t"<<s.revenue<<"\t"<<s.avg_price();   //“\t”水平制表,跳到下一个空格位置;
	return out;
}

第一个形参是对ostream的引用,在该对象上将产生输出。ostream为非const,因为写入到流会改变流的状态。该形参是一个引用,因为不能复制osteram对象。
第二个形参 一般应是对要输出的类类型的引用。该形参是一个引用以避免复制实参,它可以是const,因为(一般而言)输出一个对象不应该改变对象。使形参成为const引用,就可以使用同一个定义来输出const和非const对象。
返回类型是一个ostream引用,它的值通常是输出操作符ostream对象。
应该注意的是: 一般而言,输出操作符应输出对象的内容,进行最小限度的格式化,他们不应该输出换行符(换行符有清空输出缓冲区的作用。
没读懂<img alt="快哭了" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/fastcry.gif" />。。。。。。。。。


2.输入操作符>>的重载
     与输出操作符类似,输入操作符的第一个形参是一个引用,指向它要读的流,并且返回的也是对同一个流的引用。它的第二个形参是对要读入的对象的非
const引用,给引用必须为非const,因为输入操作符的目的是将数据读入到这个对象中。
     //更重要但是通常重视不够的是,输入和输出操作符有如下区别:输入操作符必须处理错误和文件结束的可能性。

istream& operator >>(istream& in , Sales_item& s)
{
    double price ;
    in>>s.isbn>>s.units_sold>>price ;
    if(in)
        s.revenue = s.units_sold * price;
        else
            s = Sales_item();        //input failed :reset object to default state
    return in;
}

关于算数操作符和关系操作符的重载遇到再写吧。。。。。。

时间: 2024-11-12 17:07:34

多关键字排序(里面有关于操作符(<<运算符 和 >>运算符 )的重载)的相关文章

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

多关键字排序

很欢迎来看我的博客,我还有很多知识没有学习,这是我的考核作业!以此记录我的学习历程!大家参考就好!如有错误,敬请指出!在此,先谢谢一番! 多关键字排序就是基数排序,我是用单链表实现多关键字的排序的,但最主要的方法仍是"分配","收集".单链表只是在分配与收集过程中起暂时的存储作用.不仅可以用链表,还可以用栈.队列--(都是线性的!!!(^_^)) 这是结点类模板的定义: #ifndef NODE_H #define NODE_H #define NULL 0 tem

【基础练习】结构体定义比较函数双关键字排序

题目好长显得很高大上的样子其实一点也不是这样= = 再次感谢里奥同学的友情支持,没有他我现在还在一片云里雾里. 之前看ruka上一直说:可以自定义排序,但必须自定义小于号或者是比较函数,一直苦于如何实践,今天请教了里奥同学,终于拨云见日. 这样的题有很多类似的,像是codevs 3991排序(例题代码即为此题,但我会告诉你我是用后面那个题代码改的么···)  洛谷P1104 生日 都是很简单的多关键字排序 二话不说,上代码 //operator < and sort #include<cstd

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

排序技巧——双关键字排序

一个萌新的成长之路 Background 在做题过程中,我们常会遇到对双关键字排序的情况,如:当分数相等时,序号小的在前. 这时我们可以通过定义cmp函数作为sort的参数进行排序. Solution 定义一个结构体,包含我们所需的关键字.例如,这是一个包含分数,序号和姓名的结构体. struct node{ int id,score; string name; }; -实现cmp函数,这里使用了两组不同的关键字. bool cmp_score_id(node a,node b) { if(a.

多关键字排序实验

一.实习目的 了解多关键字的使用范围:编写程序实现对汽车牌照的排序. 二.实验原理 了解多关键字的使用范围,并实现对牌照按多关键字排序后的快速查找. [问题描述] 为加快速度需先对数据记录按关键字排序,在汽车数据模型中,汽车是关键字,而且是具有结构特点的一类关键字.因为汽车牌照是汉字,字母和数字混编的,例如:AD7328.这种记录集合是一个适于利用多关键字进行排序的典型例子. [基本任务] (1)利用链式基数排序方法实现排序. (2)在排序的基础上,利用二分查找的思想,实现对汽车记录按关键字的查

Python关键字排序

一.当排序关键字多于1个时,我们使用lambda表达式来描述关键字key arr=[(1,4,3),(1,3,3),(2,1,4),(3,5,1)] arr.sort(key=lambda s:(s[0],s[1])) #两个关键字排序print(arr) # 可以看到输出结果是根据列表中元组的第一项和第二项排序[(1, 3, 3), (1, 4, 3), (2, 1, 4), (3, 5, 1)] 二.若我想让第一个关键字正序,第二个关键字倒序,该怎么办呢?arr=[(1,4,3),(1,3,

SQL 按关键字排序

SQL ORDER BY Keyword(按关键字排序) ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于按升序或降序对结果集进行排序. ORDER BY 关键字默认情况下按升序排序记录. 如果需要按降序对记录进行排序,可以使用DESC关键字. SQL ORDER BY 语法 SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|

javascript运算符——位运算符

× 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度极快,且合理使用能达到很好的效果.本文将介绍javascript中常常被忽视的运算符——位运算符 二进制表示 ECMAScript中的所有数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值,而是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数 这种位数转换使得在对特

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定