源代码:
// STLPhonBook.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
using namespace std;
enum MenuOptionSelect
{
InsertContactsetEnity=0,
DisplayEntries=1,
FindNumber=2,
DeleteConnect=3,
QuitApplation=4
};
struct ContactItem
{
string strYouName;
string strYouNumber;
ContactItem(const string & strName,const string &strNumber)
{
strYouName=strName;
strYouNumber=strNumber;
}
bool operator == (const ContactItem &itemToCompare) const
{
return (itemToCompare.strYouName==this->strYouName);
}
bool operator < (const ContactItem & itemtoCompare) const
{
return (this->strYouName<itemtoCompare.strYouName);
}
};
int ShowMenu();
ContactItem GetConnectInfo();
void DisplayConnectSet(const set<ContactItem> & setConnects);
void FindConnect(const set<ContactItem>& setConnects);
void DelateConnects(set<ContactItem >& setConnects);
int _tmain(int argc, _TCHAR* argv[])
{
set<ContactItem> setConnects;
int nUserSelection=InsertContactsetEnity;
//实现的就是为了一直循环 供用户选择 知道选择 结束程序
while(nUserSelection=ShowMenu()!=(int)QuitApplation)
{
switch(nUserSelection)
{
case InsertContactsetEnity:
setConnects.insert(GetConnectInfo());
cout<<"电话薄更新成功!"<<endl;
break;
case DisplayEntries:
DisplayConnectSet(setConnects);
break;
case FindNumber:
FindConnect(setConnects);
break;
case DeleteConnect:
DelateConnects(setConnects);
DisplayConnectSet(setConnects);
break;
default:
cout<<"非法输入!你得选择0-4里面的数据!!"<<endl;
break;
}
}
return 0;
}
void DisplayConnectSet(const set<ContactItem> & setConnects)
{
cout<<"* * * * * * * 电话簿信息 * * * * * * *"<<endl;
cout<<"总共有"<<setConnects.size()<<"个电话信息"<<endl;
set<ContactItem>::const_iterator iterConnect=setConnects.begin();
while(iterConnect!=setConnects.end())
{
cout<<"姓名:"<<iterConnect->strYouName<<" 电话:"<<iterConnect->strYouNumber<<endl;
iterConnect++;
}
}
ContactItem GetConnectInfo()
{
cout<<"请输入名字:>>";
string strName;
cin>>strName;
string strPhonNumber;
cout<<strName<<"的电话号码:>>";
cin>>strPhonNumber;
return ContactItem(strName,strPhonNumber);
}
int ShowMenu()
{
cout<<"**** * * * * ***欢迎,请选择***** * * * *******"<<endl;
cout<<"选择 0 添加 姓名以及 电话 "<<endl;
cout<<"选择 1 来显示所有电话信息 "<<endl;
cout<<"选择 2 来查找信息 "<<endl;
cout<<"选择 3 来删除电话信息"<<endl;
cout<<"选择 4 来结束电话簿服务 !"<<endl;
cout<<">>";
int nYourSelect=0;
cin>>nYourSelect;
cout<<endl;
return nYourSelect;
}
void FindConnect(const set<ContactItem>& setConnects)
{
cout<<"@@@@@@@@@@@@@@@@@@@@@22"<<endl;
cout<<"输入名字,哥来帮你找:"<<endl;
cout<<">>"<<endl;
string strName;
cin>>strName;
set<ContactItem>::const_iterator iterFind=setConnects.find(ContactItem(strName,""));
if (iterFind!=setConnects.end())
{
cout<<strName<<" 被找到!电话号码:"<<iterFind->strYouNumber<<endl;
}
else
cout<<"貌似没有这个人啊???"<<endl;
cout<<endl;
return;
}
void DelateConnects(set<ContactItem >& setConnects)
{
cout<<"你喜爱删除谁的信息捏??"<<endl;
cout<<">>"<<endl;
string strName;
cin>>strName;
size_t nDelet=setConnects.erase(ContactItem(strName,""));
if (nDelet>0)
{
cout<<strName<<"删除了!"<<endl;
}
else
cout<<strName<<"没找到!"<<endl;
}
这个礼拜学习了STL简单应用,仿照例子写了一个模仿电话簿功能的set的应用。
自己照着例子做的STL的简单应用。牛人不需要,俺是给新手们分享的。
而且看了《编程方法学》这个公开课,就试着以自顶向下的方式分析一下自己的代码,并分析自己碰到的问题。
首先是需求,我要做一个控制台下的电话簿,可以有一个菜单,里面存数据,删除数据,显示数据,搜索数据的功能(主要是为了应用STL)
所以我先定义了一个while循环
1 while(nUserSelection=ShowMenu()!=(int)QuitApplation)
2 {
3 switch(nUserSelection)
4 {
5 case 0:
6 setConnects.insert(GetConnectInfo()); //获取输入的值
7 cout<<"电话薄更新成功!"<<endl;
8 break;
9
10 case 1:
11 DisplayConnectSet(setConnects); //显示所有得知
12 break;
13
14 case 2:
15 FindConnect(setConnects);//查找输入的值
16 break;
17
18 case3:
19 DelateConnects(setConnects); 是//删除
20 DisplayConnectSet(setConnects);//然后显示
21 break;
22
23 default:
24 cout<<"非法输入!你得选择0-4里面的数据!!"<<endl;
25 break;
26
27 }
这时候需要一个电话簿的类了。为了简单,我写了结构体,
1 struct ContactItem
2 {
3 string strYouName;
4 string strYouNumber;
5
6 ContactItem(const string & strName,const string &strNumber)
7 {
8 strYouName=strName;
9 strYouNumber=strNumber;
10 }
11
12 bool operator == (const ContactItem &itemToCompare) const
13 {
14 return (itemToCompare.strYouName==this->strYouName);
15 }
16
17 bool operator < (const ContactItem & itemtoCompare) const
18 {
19 return (this->strYouName<itemtoCompare.strYouName);
20 }
21 };
结构体中,在set的的排序中我为了默认以名字的排序,重载了"<" 使得按照字母的顺序排列。
这样以来,我们就可以操作一个 ContactItem 类型的set对象了。下面一个一个实现功能。
1.获取输入的值:实现输入姓名以及电话,所以函数返回值为 ContactItem 。
1 ContactItem GetConnectInfo()
2 {
3 cout<<"请输入名字:>>";
4 string strName;
5 cin>>strName;
6 string strPhonNumber;
7
8 cout<<strName<<"的电话号码:>>";
9 cin>>strPhonNumber;
10 return ContactItem(strName,strPhonNumber);//构造
11 }
2.显示所有保存的数据 : 遍历容器的所有内容,并打印。
用到迭代器:指向赋值容器的指针。所以操作迭代器就实现了遍历容器了。个人喜欢while,只有到中间的某个位置的时候,才会用for循环。(不担心位置问题)
1 void DisplayConnectSet(const set<ContactItem> & setConnects)
2 {
3 cout<<"* * * * * * * 电话簿信息 * * * * * * *"<<endl;
4 cout<<"总共有"<<setConnects.size()<<"个电话信息"<<endl;
5
6 set<ContactItem>::const_iterator iterConnect=setConnects.begin();
7 while(iterConnect!=setConnects.end())
8 {
9 cout<<"姓名:"<<iterConnect->strYouName<<" 电话:"<<iterConnect->strYouNumber<<endl;
10 iterConnect++;
11 }
12
13 }
3.查找。find.
STL中定义: iterator find ( const key_type& x ) const;返回迭代器的类型,适合定位及显示。
1 void FindConnect(const set<ContactItem>& setConnects)
2 {
3 cout<<"@@@@@@@@@@@@@@@@@@@@@22"<<endl;
4 cout<<"输入名字,哥来帮你找:"<<endl;
5 cout<<">>"<<endl;
6 string strName;
7 cin>>strName;
8
9 set<ContactItem>::const_iterator iterFind=setConnects.find(ContactItem(strName,""));
10 if (iterFind!=setConnects.end())
11 {
12 cout<<strName<<" 被找到!电话号码:"<<iterFind->strYouNumber<<endl;
13 }
14 else
15 cout<<"貌似没有这个人啊???"<<endl;
16 cout<<endl;
17 }
4.删除 erase。
void erase ( iterator position ); size_type erase ( const key_type& x ); void erase ( iterator first, iterator last );
分别用来传入迭代器删除、值删除(返回删除的个数,当然set不会又重复的,如果Muitiset的话就可以有好几个了)。
1 void DelateConnects(set<ContactItem >& setConnects)
2 {
3 cout<<"你喜爱删除谁的信息捏??"<<endl;
4 cout<<">>"<<endl;
5
6 string strName;
7 cin>>strName;
8
9 size_t nDelet=setConnects.erase(ContactItem(strName,""));
10
11 if (nDelet>0)
12 {
13 cout<<strName<<"删除了!"<<endl;
14
15 }
16 else
17 cout<<strName<<"没找到!"<<endl;
这样,几个功能实现了,每个函数里面达到了原语级别。不用再往下分解。
另外,在switch中,为了编程的可读性强,定义一下枚举类型,
1 enum MenuOptionSelect
2 {
3 InsertContactsetEnity=0,
4 DisplayEntries=1,
5 FindNumber=2,
6 DeleteConnect=3,
7 QuitApplation=4
8 };
实现了可读性强的效果。
这就是我这几天学习的东西,发出来给新手看的,STL简单应用。
之后,也碰到了一些编译上的问题:
while循环中 忘记加括号。
while(nUserSelection=ShowMenu()!=(int)QuitApplation)
调试是nUserSelection 值始终是 1,首先判断ShowMenu() 与 (int)QuitApplation)是否相等,并返回结果给 nUserSelection
加上括号 while((nUserSelection=ShowMenu())!=(int)QuitApplation)
过程相当于
nUserSelection=ShowMenu()
while(nUserSelection!=(int)QuitApplation)
源程序:http://115.com/file/dpvawrhi#