C++ I/O 麻雀虽小五脏俱全
来源:互联网 发布:美工和平面设计 编辑:程序博客网 时间:2024/04/28 06:13
真正的C++ (1)不提倡指针 (2)提倡数据抽象,提倡使用类 (3)提倡使用库
------<<C++沉思录>>
C++I/O设备,迭代配接器
输入输出流迭代器
instream_iterator<type>
ostream_iterator<type>
//构造函数
ostream_iterator<T>(ostream)//调用operator<<
ostream_iterator<T>(ostream,delim)
istream_iterator<T>()//end-of-stream迭代器
istream_iterator<T>(istream)//调用operator>>
//操作
*iter
++iter
//从控制台到容器
istream_iterator<T> first(cin);
istream_iterator<T> last;
copy(first,last,back_inserter(v));//调用容器的push_back方法
vector<string> vs(first,last);
//从容器到控制台
ostream_iterator<T> first(cout," ");
copy(v.begin(),v.end(),first);
//从文件到容器
ifstream fin("inputfile.txt");
istream_iterator<T> first(fin),last;
vector<T> v(first,last);
//从文件到string
ifstream fin("inputfile.txt");
//下面再读取字符的时候文件中的空白字符也会放到string中
istreambuf_iterator<char> first(fin),last;//注意与上面一段的区别
string v(first,last);
//如果使用istream_iterator<char> first(fin),last;则会从文件中用
//>>操作符读取char变量放到string中,空白符丢失
//从容器到文件
ofstream fout("outputfile.txt");
ostream_iterator<T> first(fout," ");//注意这里不需要last
copy(v.begin(),v.end(),first);
本文中问题的解决很好的体现了以上几点,如果不想学习C++误入歧途,主要用到了输入输出操作符重载,严格弱排序,用copy算法实现I/O
问题:
一组数据 有以下参数char名字name int年龄age int组别group int细分化组别devide int职位position数据例子A0 33 6 1 2 A1 42 6 1 6 A2 40 6 1 5 A3 52 6 2 6 A4 36 6 2 2 A5 51 6 2 4 A6 23 5 1 3 A7 48 5 1 2 A8 30 5 1 1 (这里的组别6为职场,细分化组别1和2分别代表两个部门2>1,职位1到6:1员工~6经理,所以6>1)(5为家庭,职位3>2>1)(组别也是6>5)排序优先级别为 组别>细分化组别>职位>年龄排序并输出(最好是输出在一个文档里面)
// 解决思路:将文件中的数据读入到vector对象中进行排序,vector必须盛放一行数据.关键是排序依赖的小于号操作符重载(必须为严格弱排序)
//完整实现
#include <iostream>#include <algorithm>#include <vector>#include <string>#include <sstream>#include <fstream>#include <iomanip>#include <iterator>using namespace std;class Person{public:Person(){}Person(const string& n,int g,int d,int p,int a):name_(n),group_(g),devide_(d),position_(p),age_(a){}friend ostream& operator<<(ostream& out,const Person& p);friend istream& operator>>(istream& in,Person& p);friend bool operator<(const Person& lhs,const Person& rhs);private:string name_;int group_;int devide_;int position_;int age_;};ostream& operator<<(ostream& out,const Person& p){out<<"[name] "<<setw(6)<<p.name_<<" [group] "<<setw(3)<<p.group_<<" [divide] "<<setw(3)<<p.devide_<<" [position] "<<setw(3)<<p.position_<<" [age] "<<setw(3)<<p.age_;return out;}istream& operator>>(istream& in,Person& p){string s;getline(in,s);istringstream iss(s);iss>>p.name_>>p.age_>>p.group_>>p.devide_>>p.position_;return in;}bool operator<(const Person& lhs,const Person& rhs){//这里的比较操作符重载满足严格弱排序,这个定义比较有代表性,请看仔细bool temp_result= (lhs.group_ < rhs.group_ || lhs.group_ == rhs.group_ && ( lhs.devide_ < rhs.devide_ ||lhs.devide_ == rhs.devide_ && (lhs.position_ < rhs.position_ ||lhs.position_ == rhs.position_ && (lhs.age_ < rhs.age_ ))));return temp_result;}int main(){ifstream fin("data.txt");if (!fin){cout<<"can't open file data.txt"<<endl;return -1;}istream_iterator<Person> first(fin),last;vector<Person> person_array(first,last);ostream_iterator<Person> cout_person(cout,"\n");copy(person_array.begin(),person_array.end(),cout_person);cout<<endl<<"sorted:"<<endl;sort(person_array.begin(),person_array.end());//输出到控制台copy(person_array.begin(),person_array.end(),cout_person);//输出到文件copy(person_array.begin(),person_array.end(),ostream_iterator<Person>(ofstream("result.txt"),"\n"));return 0;}
程序输出:
[name] A0 [group] 6 [divide] 1 [position] 2 [age] 33
[name] A1 [group] 6 [divide] 1 [position] 6 [age] 42
[name] A2 [group] 6 [divide] 1 [position] 5 [age] 40
[name] A3 [group] 6 [divide] 2 [position] 6 [age] 52
[name] A4 [group] 6 [divide] 2 [position] 2 [age] 36
[name] A5 [group] 6 [divide] 2 [position] 4 [age] 51
[name] A6 [group] 5 [divide] 1 [position] 3 [age] 23
[name] A7 [group] 5 [divide] 1 [position] 2 [age] 48
[name] A8 [group] 5 [divide] 1 [position] 1 [age] 30
[name] A9 [group] 6 [divide] 2 [position] 6 [age] 53
sorted:
[name] A8 [group] 5 [divide] 1 [position] 1 [age] 30
[name] A7 [group] 5 [divide] 1 [position] 2 [age] 48
[name] A6 [group] 5 [divide] 1 [position] 3 [age] 23
[name] A0 [group] 6 [divide] 1 [position] 2 [age] 33
[name] A2 [group] 6 [divide] 1 [position] 5 [age] 40
[name] A1 [group] 6 [divide] 1 [position] 6 [age] 42
[name] A4 [group] 6 [divide] 2 [position] 2 [age] 36
[name] A5 [group] 6 [divide] 2 [position] 4 [age] 51
[name] A3 [group] 6 [divide] 2 [position] 6 [age] 52
[name] A9 [group] 6 [divide] 2 [position] 6 [age] 53
请按任意键继续. . .
下面是以为C高手的解决方法,我认为比较简洁,用到了很多C的优点(强制类型转换,无视一切类型,方便快速)
// 使用 qsort 排序函数// qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))#include <stdlib.h>#include <stdio.h>// 定义结构typedef struct tag_Persion{ char name; int age,group,devide,position;}Persion;// 比较算法 组别>细分>职位>年龄int comp(const void* _a,const void* _b){ int re; Persion a=*(Persion*)_a; Persion b=*(Persion*)_b; //组别 if((re=a.group-b.group)) return re*40000; //细分 if((re=a.devide-b.devide)) return re*3000; //职位 if((re=a.position-b.position)) return re*200; //年龄 if((re=a.age-b.age)) return re; return 0;}// 显示数据void show(Persion* s,int l){ printf("\t名称\t年龄\t组别\t细化\t职业\n"); for(int i=0;i<l;i++){ printf("\tA%c%8d%8d%8d%8d\n", s[i].name,s[i].age,s[i].group, s[i].devide,s[i].position); }}// 主函数void main(){ // 数据 int _data[]={ '0',33,6,1,2, '1',42,6,1,6, '2',40,6,1,5, '3',52,6,2,6, '4',36,6,2,2, '5',51,6,2,4, '6',23,5,1,3, '7',48,5,1,2, '8',30,5,1,1}; int len=sizeof(_data)/sizeof(Persion); Persion* data=(Persion*)_data; // 快速排序(C语言函数) qsort(data,len,sizeof(Persion),comp); // 显示 show(data,len);}
这个答案被提问者给出了满意答案,而上面的C++估计提问者看不懂,我优点孤芳自赏的感觉了
- C++ I/O 麻雀虽小五脏俱全
- 麻雀虽小五脏俱全
- 麻雀虽小,五脏俱全 系列目录
- 51单片机---麻雀虽小,五脏俱全
- 麻雀虽小五脏俱全----ZC评价系统
- 麻雀虽小,五脏俱全——由C语言小程序深入学习软件工程和设计开发规范
- NSIS入门程序实例,麻雀虽小,五脏俱全
- 麻雀虽小,五脏俱全:定期重建索引(oracle)
- 麻雀虽小五脏俱全--一个小项目的总结
- 麻雀虽小,五脏俱全-网络版WPF计时控制器-01
- 麻雀虽小,五脏俱全-网络版WPF计时控制器-02
- 麻雀虽小五脏俱全 最小Linux系统试用
- thinking in asp 之五 麻雀虽小 五脏俱全
- Angular最佳实践之$http-麻雀虽小 五脏俱全
- 赤虹JSON模块 v1.0 麻雀虽小, 五脏俱全
- 麻雀虽小五脏俱全 vivo X7音频播放测评
- 推荐系统(RS),麻雀虽小,五脏俱全
- 麻雀虽小五脏俱全 比杯子还小的电脑
- [原创]正确使用DllGetVersion
- 在IDL中识别一个字符串是否可以转换为double数字的函数IsDoubleString
- VBe整人程序--关机
- sql注入
- PHP: 使用mysql_fetch_array()来获取数据
- C++ I/O 麻雀虽小五脏俱全
- [转]风雨20年:我所积累的20条编程经验
- 存储过程
- 无聊的网络
- 哈弗曼编码
- oracle转换函数utl_raw
- WINDOWS 7 下ADS1.2启动出现Unhandled Exception的解决办法。
- 行当中的老同志
- 关于国学和历史一些感悟-转自“战隼的学习探索”