C++ 中基于STL set实现电话簿

C++ 中基于STL set实现电话簿

学习 set 和 multiset 的基本函数后,接下来看一个使用 set 容器的实际应用程序。程序清单 19.5 是
基于菜单的电话簿的简单实现,它让用户能够插入、查找、删除和显示人名和电话号码。

0: #include <set>
1: #include <iostream>
2: #include <string>
3: using namespace std;
4:
5: template <typename T>
6: void DisplayContents (const T& container)
7: {
8: for (auto iElement = container.cbegin();
9: iElement != container.cend();
10: ++ iElement )
11: cout << *iElement << endl;
12:
13: cout << endl;
14: }
15:
16: struct ContactItem
17: {
18: string name;
19: string phoneNum;
20: string displayAs;
21:
22: ContactItem (const string& nameInit, const string & phone)
23: {
24: name = nameInit;
25: phoneNum = phone;
26: displayAs = (name + ": " + phoneNum);
27: }
28:
29: // used by set::find() given contact list item
30: bool operator == (const ContactItem& itemToCompare) const
31: {
32: return (itemToCompare.name == this->name);
33: }
34:
35: // used to sort
36: bool operator < (const ContactItem& itemToCompare) const
37: {
38: return (this->name < itemToCompare.name);
39: }
40:
41: // Used in DisplayContents via cout
42: operator const char*() const
43: {
44: return displayAs.c_str();
45: }
46: };
47:
48: int main ()
49: {
50: set<ContactItem> setContacts;
51: setContacts.insert(ContactItem("Jack Welsch", "+1 7889 879 879"));
52: setContacts.insert(ContactItem("Bill Gates", "+1 97 7897 8799 8"));
53: setContacts.insert(ContactItem("Angi Merkel", "+49 23456 5466"));
54: setContacts.insert(ContactItem("Vlad Putin", "+7 6645 4564 797"));
55: setContacts.insert(ContactItem("John Travolta", "91 234 4564 789"));
56: setContacts.insert(ContactItem("Ben Affleck", "+1 745 641 314"));
57: DisplayContents(setContacts);
58:
59: cout << "Enter a name you wish to delete: ";
60: string inputName;
61: getline(cin, inputName);
62:
63: auto contactFound = setContacts.find(ContactItem(inputName, ""));
64: if(contactFound != setContacts.end())
65: {
66: setContacts.erase(contactFound);
67: cout << "Displaying contents after erasing " << inputName << endl;
68: DisplayContents(setContacts);
69: }
70: else
71: cout << "Contact not found" << endl;
72:
73: return 0;
74: }

输出:
Angi Merkel: +49 23456 5466
Ben Affleck: +1 745 641 314
Bill Gates: +1 97 7897 8799 8
Jack Welsch: +1 7889 879 879
John Travolta: 91 234 4564 789
Vlad Putin: +7 6645 4564 797
Enter a name you wish to delete: John Travolta
Displaying contents after erasing John Travolta
Angi Merkel: +49 23456 5466
Ben Affleck: +1 745 641 314
Bill Gates: +1 97 7897 8799 8
Jack Welsch: +1 7889 879 879
Vlad Putin: +7 6645 4564 797
分析:
这个程序清单与按字母顺序对 std::list 进行排序的程序清单 18.7 很像,差别在于 std::set 排序是在
插入元素时进行的。输出表明,您不需要调用任何函数来对 set 中的元素进行排序,因为已经在插入元素时使用第36~39行实现的operator <进行了排序。您让用户指定要删除的条目, 然后第63行调用find( )
找到该条目,而第 66 行使用 erase( )删除该条目。

这个电话簿的实现是基于 STL set 的,因此不允许多个元素包含相同的值。如果要让电
话簿能够存储两个相同的人名,则应使用 STL multiset。如果 setContacts 为 multiset,上
述代码仍可正确运行。要使用 multiset 存储多个值相同的元素,应使用 count( )成员函数
来获悉有多少个元素包含特定的值。
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值