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++估计提问者看不懂,我优点孤芳自赏的感觉了

原创粉丝点击