用STL做的简易英汉词典(VS2005下编写)

// dictionary.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<utility>

using namespace std;
typedef map<string,vector<string>*>::value_type ValueType;
typedef map<string,vector<string>*>::iterator map_iterator;

class Dectionary
{
public:
 Dectionary()
{
 
}
 ~Dectionary()
 {
 
 }
 
void inputcitiao();//此函数用来添加词条及其解释
void outputcitiao();//此函数用来输出所有词条及其解释
void lookforcitiao();//此函数用来查找词条的解释
void modifycitiao();//此函数用来修改词条的解释
void deletecitiao();//此函数用来删除词条
void showmenu();//此函数用来显示菜单和提供选择

private: 
   map<string, vector<string>*> citiao;
};
 

inline void  Dectionary::inputcitiao()

 string s1,s2;
 cout<<"/n请输入英文词条(以输入‘#’号结束输入)"<<endl;
 cin>>s1;
 cout<<"/n请输入它的解释"<<endl;
 while(cin>>s2)
 {
  if(s2=="#")
   return;
  if(!citiao.count (s1))
    {
  vector<string>*p=new vector<string>;
  p->push_back (s2);
     citiao.insert (ValueType(s1,p));
    }
 else
    (*citiao[s1]).push_back (s2);
 }

}


inline void Dectionary::outputcitiao()
{  
 char ch;
 if(!citiao.size ())
 {cout<<"/n词典中没有任何词条"<<endl;
 return ;
 }

 cout<<"/n词条将依次输出"<<endl;
 map<string,vector<string>*>::iterator iter_begin=citiao.begin ();
 map<string,vector<string>*>::iterator iter_end=citiao.end ();
 int old_count=0;
 for(   ;iter_begin!=iter_end;++iter_begin)
 {   int count=0;
     vector<string>*p=iter_begin->second ;
  vector<string>::iterator siter_begin=p->begin ();
  vector<string>::iterator siter_end=p->end ();

  cout<<"第"<<++old_count<<"个词条"<<iter_begin->first <<"的解释为:"<<endl;
  for(   ;siter_begin!=siter_end;++siter_begin)
  {
   cout<<"("<<++count<<")"<<*siter_begin<<endl;
  }
 }
 cin>>ch;
}


inline void Dectionary::lookforcitiao()
{  
 char ch;
 cout<<"/n请输入要查找的词条"<<endl;
 string s1;
 cin>>s1;
 if(!citiao.count (s1))
 cout<<"/n没有要查找的词条"<<endl;
 else
 {
  cout<<s1<<"的解释为:"<<endl;
  vector<string>::iterator siter_begin=citiao[s1]->begin ();
  vector<string>::iterator siter_end=citiao[s1]->end ();
  string::size_type count=0;
  for( ;siter_begin!=siter_end;++siter_begin)
  {  cout<<"("<<++count<<")"<<*siter_begin<<endl;
  }
 }
 cin>>ch;
}


inline void Dectionary::modifycitiao ()
{
 cout<<"/n请输入要修改的词条"<<endl;
 string s1,s2;
 cin>>s1;
 if(!citiao.count (s1))
  cout<<"/n找不到要修改的词条"<<endl;
 else
 {
  cout<<"已经找到要修改的词条"<<s1<<endl;
  vector<string>*p=citiao[s1];
  vector<string>::iterator  siter_begin=citiao[s1]->begin ();
  vector<string>::iterator  siter_end=citiao[s1]->end ();
  vector<string>::iterator buff;
  cout<<"词条的内容为"<<endl;

        string::size_type count=0;
  int a;
  for( ;siter_begin!=siter_end;++siter_begin)
  {  cout<<"("<<++count<<")"<<*siter_begin<<endl;
  }

  cout<<"/n请输入要修改的是第几个解释"<<endl;
  cin>>a;
  while(a<0 || a>(citiao[s1]->size ()))
  {cout<<"/n没有此条解释,请重新输入"<<endl;
  cin>>a;
  }
        siter_begin=citiao[s1]->begin ();
   

        buff=p->erase(siter_begin+a-1);      //对vector<string>的删除和修改出现问题
  cout<<"/n请输入新的解释"<<endl;
  cin>>s2;
  p->insert (buff,s2);
  cout<<"/n修改后的词条解释为"<<endl;
  count=0;
        siter_begin=citiao[s1]->begin ();
        siter_end=citiao[s1]->end ();
        for( ;siter_begin!=siter_end;++siter_begin)
  {  cout<<"("<<++count<<")"<<*siter_begin<<endl;
  }

 }
}

 
inline void Dectionary::deletecitiao()
{  
 char ch;
 string s1;
 cout<<"/n请输入要删除的词条"<<endl;
 cin>>s1;
 if(!citiao.count (s1))
  cout<<"/n没有指定要删除的词条"<<endl;
 else
 {
  if(citiao.erase (s1))
   cout<<"/n删除成功"<<endl;
  else
   cout<<"/n删除不成功"<<endl;
 }
 cin>>ch;
}

inline void Dectionary:: showmenu()
{    
 char ch;
 cout<<"********************************欢迎进入本词典系统******************************"<<endl;
 
 cout<<"                                1.添加新的词条                                   "<<endl;
 cout<<"                                2.查询词条                                       "<<endl;
 cout<<"                                3.按字母顺序输出所有词条                         "<<endl;
 cout<<"                                4.删除一个词条                                   "<<endl;
 cout<<"                                5.修改一个词条                                   "<<endl;
 cout<<"********************************请选择操作**************************************"<<endl;
 cout<<endl;
 int a;
 cin>>a;
 while(a<1 || a>5)
 {
  cout<<"没有这个选项,请重新选择"<<endl;
  cin>>a;
 }
 switch(a)
 {
 case 1:
   inputcitiao();
      break;
 case 2:
      lookforcitiao();
   break;
 case 3:
      outputcitiao();
   break;
 case 4:
      deletecitiao();
   break;
 case 5:
      modifycitiao();
   break;
 }

    system("cls");
 cout<<"/n要退出本系统吗?按Y(y)退出系统,按N(n)回到菜单;"<<endl;

 cin>>ch;
 while(!(ch=='y'||ch=='Y'||ch=='N'||ch=='n'))
 cin>>ch;
 if(ch=='y'||ch=='Y')
 return;
 else
 showmenu();
 
}

 

 

int _tmain(int argc, _TCHAR* argv[])
{
 Dectionary dc;
 dc.showmenu ();
 return 0;
}

 

/*程序心得:
(1)map中的元素是按照规定的次序排列的,而不是按照你的输入顺序排列,这就省了我写一个排序的函数
还害我写了半天这个排序函数,还错误百出;
(2)buff=p->erase(siter_begin+a-1); 和p->insert (buff,s2);在运行的时候突然中断
原因是:在for循环里面的时候siter_begin改变了,要重新设置siter_begin的值。这是个低级的错误。但是要注意的是
顺序容器vector在调用成员函数erase和insert的时候会使所有的迭代器失效,所以后面要恢复
siter_begin和siter_end的值,才能够最后显示修改后的词条内容。(effective STL的内容)


*/
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值