您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习->经验总结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简洁明了。

废话不多说,粘代码。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: