数据结构学习->经验总结1
2016-03-09 23:31
549 查看
本人比较懒,很久才写一次博客。(由于最近写了代码,有些语法应该总结一下)
先粘代码,这是数据结构的练习
首先在写的过程中,查阅了一些资料,过了些时候也忘了人家博客地址(⊙﹏⊙)b。。应该沾上的。这里先抱歉。
1.map用的是非线性的存储方式,所以不能直接进行sort排序。
2.map的排序方式是红黑树,可以直接重定义比较方式进行排序,insert自动排序。
3.这里可以用vector对map进行存储改变存储方式,然后就可以用sort了!
4.map的键值有唯一性,可以删除列表中的重复项。
5.typedef pair可以复制map。因为map的父类是pair。。。
6.这条很重要,因为我百度不到。很多acm的同学喜欢用freopen,我也是如此。然而有些时候读文件后需要控制台输入的时候,就会很麻烦。这里网上说用
fclose("stdin");
freopen("CON","r",stdin);
这两句话进行重定向。但是这里cin却不能使用了。为了搞定这个必须使用ifstream,对cin的源重定向,就可以使用了。
7.goto的妙用。这里用到goto进行对重复操作的循环。如果用while就感觉很难看。有时候脑袋热了就搞不清楚了。goto简洁明了。
废话不多说,粘代码。
先粘代码,这是数据结构的练习
首先在写的过程中,查阅了一些资料,过了些时候也忘了人家博客地址(⊙﹏⊙)b。。应该沾上的。这里先抱歉。
1.map用的是非线性的存储方式,所以不能直接进行sort排序。
2.map的排序方式是红黑树,可以直接重定义比较方式进行排序,insert自动排序。
3.这里可以用vector对map进行存储改变存储方式,然后就可以用sort了!
4.map的键值有唯一性,可以删除列表中的重复项。
5.typedef pair可以复制map。因为map的父类是pair。。。
6.这条很重要,因为我百度不到。很多acm的同学喜欢用freopen,我也是如此。然而有些时候读文件后需要控制台输入的时候,就会很麻烦。这里网上说用
fclose("stdin");
freopen("CON","r",stdin);
这两句话进行重定向。但是这里cin却不能使用了。为了搞定这个必须使用ifstream,对cin的源重定向,就可以使用了。
7.goto的妙用。这里用到goto进行对重复操作的循环。如果用while就感觉很难看。有时候脑袋热了就搞不清楚了。goto简洁明了。
废话不多说,粘代码。
#include<stdio.h> #include<iostream> #include<cstring> #include<cmath> #include<vector> #include<string> #include<list> #include<map> #include<algorithm> #include<utility> #include<iterator> #include<sstream> #include<stdlib.h> #include<fstream> using namespace std; struct book//定义书类 { string name; string ibsn; double price; }; typedef pair<string, book> PAIR; //map中的比较函数,pair重载操作符 bool operator< (const PAIR& lhs, const PAIR& rhs) { return lhs.second.price < rhs.second.price; } bool operator> (const PAIR& lhs, const PAIR& rhs) { return lhs.second.price > rhs.second.price; } bool cmp_by_value1(const PAIR& lhs, const PAIR& rhs) { //比较函数 return lhs.second.price < rhs.second.price; } bool cmp_by_value2(const PAIR& lhs, const PAIR& rhs){ return lhs.second.price>rhs.second.price; } map<string,book> book_map;//定义map全局变量 void input(book a)//向map添加 { book_map.insert(pair<string,book>(a.ibsn,a)); } void output(book a)//输出 { cout<<"ISBN:"<<a.ibsn<<" 书名:"<<a.name<<" 价格:"<<a.price<<endl; } void find_book(string value)//找书名查找value值复杂度O(n) { int a=0; for(map<string,book>::iterator first=book_map.begin();first!=book_map.end();first++) { if(first->second.name.compare(value)==0) { output(first->second); a=1; } } if(a==0) cout<<"找不到"<<endl; } void maopao(vector<PAIR>::iterator it,int n)//冒泡排序复杂度O(n^2) { for(int i=0;i<n-1;i++) { for(int j=0;j<n-1-i;j++) { if(it[j].second.price<it[j+1].second.price) { PAIR temp=it[j]; it[j]=it[j+1]; it[j+1]=temp; } } } } int main() { freopen("book.txt","r",stdin);//利用freopen重定向 int p; cin>>p; for(int i=0;i<p;i++)//利用map可以查找book.txt的错误,在第60行与第61行有重复的,map可以自行删除 { book temp; cin>>temp.ibsn>>temp.name>>temp.price; input(temp); }//输入105个条目,有效103个 fclose(stdin); freopen("CON","r",stdin);//关闭重定向 ifstream in("CON");//关闭重定向 cin.rdbuf(in.rdbuf());//关闭重定向 vector<PAIR> book_vec(book_map.begin(),book_map.end());//构造vector进行排序 loop1://循环loop cout<<"查找请输入1,排序请输入2:"; int caozuo; scanf("%d",&caozuo); switch(caozuo) { case 1://查找 { cout<<"按书号查找请输入1,按书名查找请输入2:"; int chazhao; scanf("%d",&chazhao); switch (chazhao) { case 1: { cout<<"请输入书号:"; string temp; cin>>temp; if(book_map.find(temp)!=book_map.end()) output(book_map.find(temp)->second); else cout<<"找不到"<<endl; } break; case 2: { cout<<"请输入书名:"; string name; cin>>name; find_book(name); } break; } }break; case 2://排序 { cout<<"排序前的顺序为(默认按书号排序):"<<endl; for(vector<PAIR>::iterator it=book_vec.begin();it!=book_vec.end();it++) { output(it->second); } cout<<"以价格从高到低排序:用冒泡排序请输入1,用sort请输入2:"; int paixu; scanf("%d",&paixu); switch(paixu) { case 1: { maopao(book_vec.begin(),book_vec.size()); cout<<"冒泡"; } break; case 2: { sort(book_vec.begin(),book_vec.end(),cmp_by_value2);//快速排序 cout<<"快速"; }break; } cout<<"排序完成,结果为:"<<endl; for(vector<PAIR>::iterator it=book_vec.begin();it!=book_vec.end();it++) { output(it->second); } }break; } cout<<"继续操作请输入1,结束请输入0:"; int end; cin>>end; if(end) goto loop1; cout<<"谢谢您的使用"<<endl; return 0; }
相关文章推荐
- 【数据结构与算法】(二) c 语言链表的简单操作
- 【数据结构与算法】(一) c 语言实现数组的简单操作
- 数据结构资料
- 数组中超过一半(N/2)的数)进阶 (找到出现次数超过N/K的数)
- 给定一个无序数组,找到其中最小的K个数
- 数据结构与算法面试题80道(6)
- 数据结构--栈
- 数据结构与算法面试题80道(5)
- 在未排序数组中找到和为k的最长子数组长度
- 反转链表
- 【数据结构链表复习】
- 数据结构与算法面试题80道(4)
- 深度遍历和广度遍历
- 简单数据结构(四)栈和队列的简单应用
- 【数据结构】线性表(链表实现)
- 数据结构与算法面试题80道(3)
- 一张大图总结数据结构与算法
- nginx学习七 高级数据结构之动态数组ngx_array_t
- 数据结构与算法面试题80道(二)
- 数据结构——链表