悠悠楠杉
用C++实现简易通讯录管理:基于vector容器的实践
引言
在日常编程实践中,通讯录管理系统是一个经典的练手项目。今天我将分享如何用C++的vector容器来实现一个简易但功能完整的通讯录管理程序。这个方案不仅适合初学者理解STL容器的使用,也能为有经验的开发者提供一些设计思路。
设计思路
通讯录的核心功能是联系人信息的增删改查。我们选择vector容器是因为:
- 内存连续:访问效率高,适合频繁遍历
- 动态扩容:无需预先确定联系人数量
- 丰富接口:提供了多种便捷的操作方法
代码实现
1. 联系人数据结构
首先定义联系人的数据结构:
cpp
struct Contact {
string name;
string phone;
string email;
string address;
string notes; // 备注信息
// 构造函数方便初始化
Contact(const string& n, const string& p, const string& e,
const string& a, const string& no)
: name(n), phone(p), email(e), address(a), notes(no) {}
// 显示联系人信息
void display() const {
cout << "姓名: " << name << endl
<< "电话: " << phone << endl
<< "邮箱: " << email << endl
<< "地址: " << address << endl
<< "备注: " << notes << endl
<< "---------------------" << endl;
}
};
2. 通讯录类设计
接着封装通讯录类,使用vector作为存储容器:
cpp
class AddressBook {
private:
vector
public:
// 添加联系人
void addContact(const Contact& contact) {
contacts.push_back(contact);
cout << "联系人添加成功!" << endl;
}
// 删除联系人
bool removeContact(const string& name) {
auto it = find_if(contacts.begin(), contacts.end(),
[&name](const Contact& c) { return c.name == name; });
if (it != contacts.end()) {
contacts.erase(it);
cout << "联系人删除成功!" << endl;
return true;
}
cout << "未找到该联系人!" << endl;
return false;
}
// 查找联系人
void findContact(const string& name) const {
bool found = false;
for (const auto& contact : contacts) {
if (contact.name.find(name) != string::npos) {
contact.display();
found = true;
}
}
if (!found) {
cout << "未找到匹配的联系人!" << endl;
}
}
// 显示所有联系人
void displayAll() const {
if (contacts.empty()) {
cout << "通讯录为空!" << endl;
return;
}
cout << "通讯录共有 " << contacts.size() << " 位联系人:" << endl;
for (const auto& contact : contacts) {
contact.display();
}
}
// 按姓名排序
void sortByName() {
sort(contacts.begin(), contacts.end(),
[](const Contact& a, const Contact& b) {
return a.name < b.name;
});
cout << "已按姓名排序!" << endl;
}
};
3. 用户交互界面
为了使用方便,我们添加一个简单的菜单系统:
cpp
void showMenu() {
cout << "\n===== 简易通讯录管理系统 =====" << endl;
cout << "1. 添加联系人" << endl;
cout << "2. 删除联系人" << endl;
cout << "3. 查找联系人" << endl;
cout << "4. 显示所有联系人" << endl;
cout << "5. 按姓名排序" << endl;
cout << "0. 退出" << endl;
cout << "请选择操作: ";
}
int main() {
AddressBook book;
int choice = 0;
string name, phone, email, address, notes;
do {
showMenu();
cin >> choice;
cin.ignore(); // 清除输入缓冲区
switch (choice) {
case 1: // 添加
cout << "请输入姓名: ";
getline(cin, name);
cout << "请输入电话: ";
getline(cin, phone);
cout << "请输入邮箱: ";
getline(cin, email);
cout << "请输入地址: ";
getline(cin, address);
cout << "请输入备注: ";
getline(cin, notes);
book.addContact(Contact(name, phone, email, address, notes));
break;
case 2: // 删除
cout << "请输入要删除的联系人姓名: ";
getline(cin, name);
book.removeContact(name);
break;
case 3: // 查找
cout << "请输入要查找的联系人姓名(支持模糊查询): ";
getline(cin, name);
book.findContact(name);
break;
case 4: // 显示所有
book.displayAll();
break;
case 5: // 排序
book.sortByName();
break;
case 0:
cout << "感谢使用,再见!" << endl;
break;
default:
cout << "无效的选择,请重新输入!" << endl;
}
} while (choice != 0);
return 0;
}
功能扩展建议
这个基础版本已经实现了通讯录的核心功能,但还有很大的改进空间:
- 持久化存储:将数据保存到文件,程序重启后仍然可用
- 高级搜索:支持多条件组合查询
- 分组管理:为联系人添加分组标签
- 数据验证:检查电话号码和邮箱格式是否合法
- 界面美化:使用更友好的用户界面
性能优化考虑
虽然vector在大多数情况下表现良好,但随着联系人数量增加,某些操作可能需要优化:
- 查找优化:可以考虑使用map或unordered_map辅助索引
- 内存管理:对于超大通讯录,可能需要考虑内存占用问题
- 批量操作:添加批量导入导出功能
总结
通过这个实践项目,我们展示了如何利用C++的vector容器构建一个功能完整的通讯录管理系统。vector的灵活性和高效性在这个场景中得到了充分体现。这个实现不仅可以帮助理解STL容器的使用,也为更复杂的系统开发奠定了基础。
编程学习最重要的是动手实践,希望这个示例能激发你更多的创意和想法!