数据结构学习->经验总结1

本人比较懒,很久才写一次博客。(由于最近写了代码,有些语法应该总结一下)

先粘代码,这是数据结构的练习

首先在写的过程中,查阅了一些资料,过了些时候也忘了人家博客地址(⊙﹏⊙)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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值