源代码:
View Code
// 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& setConnects); void FindConnect(const set & setConnects); void DelateConnects(set & setConnects); int _tmain(int argc, _TCHAR* argv[]) { set setConnects; int nUserSelection=InsertContactsetEnity; //实现的就是为了一直循环 供用户选择 知道选择 结束程序 while(nUserSelection=ShowMenu()!=(int)QuitApplation) { switch(nUserSelection) { case InsertContactsetEnity: setConnects.insert(GetConnectInfo()); cout<<"电话薄更新成功!"< & setConnects) { cout<<"* * * * * * * 电话簿信息 * * * * * * *"< ::const_iterator iterConnect=setConnects.begin(); while(iterConnect!=setConnects.end()) { cout<<"姓名:"< strYouName<<" 电话:"< strYouNumber< >"; string strName; cin>>strName; string strPhonNumber; cout< <<"的电话号码:>>"; cin>>strPhonNumber; return ContactItem(strName,strPhonNumber); } int ShowMenu() { cout<<"**** * * * * ***欢迎,请选择***** * * * *******"< >"; int nYourSelect=0; cin>>nYourSelect; cout< & setConnects) { cout<<"@@@@@@@@@@@@@@@@@@@@@22"< >"< >strName; set ::const_iterator iterFind=setConnects.find(ContactItem(strName,"")); if (iterFind!=setConnects.end()) { cout< <<" 被找到!电话号码:"< strYouNumber< & setConnects) { cout<<"你喜爱删除谁的信息捏??"< >"< >strName; size_t nDelet=setConnects.erase(ContactItem(strName,"")); if (nDelet>0) { cout< <<"删除了!"<
这个礼拜学习了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<<"电话薄更新成功!"<
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
结构体中,在set的的排序中我为了默认以名字的排序,重载了"<" 使得按照字母的顺序排列。
这样以来,我们就可以操作一个 ContactItem 类型的set对象了。下面一个一个实现功能。
1.获取输入的值:实现输入姓名以及电话,所以函数返回值为 ContactItem 。
1 ContactItem GetConnectInfo() 2 { 3 cout<<"请输入名字:>>"; 4 string strName; 5 cin>>strName; 6 string strPhonNumber; 7 8 cout<<<"的电话号码:>>"; 9 cin>>strPhonNumber; 10 return ContactItem(strName,strPhonNumber);//构造 11 }
2.显示所有保存的数据 : 遍历容器的所有内容,并打印。
用到迭代器:指向赋值容器的指针。所以操作迭代器就实现了遍历容器了。个人喜欢while,只有到中间的某个位置的时候,才会用for循环。(不担心位置问题)
1 void DisplayConnectSet(const set& setConnects) 2 { 3 cout<<"* * * * * * * 电话簿信息 * * * * * * *"< ::const_iterator iterConnect=setConnects.begin(); 7 while(iterConnect!=setConnects.end()) 8 { 9 cout<<"姓名:"< strYouName<<" 电话:"< strYouNumber<
3.查找。find.
STL中定义: iterator find ( const key_type& x ) const;返回迭代器的类型,适合定位及显示。
1 void FindConnect(const set& setConnects) 2 { 3 cout<<"@@@@@@@@@@@@@@@@@@@@@22"< >"< >strName; 8 9 set ::const_iterator iterFind=setConnects.find(ContactItem(strName,"")); 10 if (iterFind!=setConnects.end()) 11 { 12 cout< <<" 被找到!电话号码:"< strYouNumber<
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& setConnects) 2 { 3 cout<<"你喜爱删除谁的信息捏??"< >"< >strName; 8 9 size_t nDelet=setConnects.erase(ContactItem(strName,"")); 10 11 if (nDelet>0) 12 { 13 cout< <<"删除了!"<
这样,几个功能实现了,每个函数里面达到了原语级别。不用再往下分解。
另外,在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#