TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码

用C++实现简易通讯录管理:基于vector容器的实践

2025-07-07
/
0 评论
/
6 阅读
/
正在检测是否收录...
07/07

引言

在日常编程实践中,通讯录管理系统是一个经典的练手项目。今天我将分享如何用C++的vector容器来实现一个简易但功能完整的通讯录管理程序。这个方案不仅适合初学者理解STL容器的使用,也能为有经验的开发者提供一些设计思路。

设计思路

通讯录的核心功能是联系人信息的增删改查。我们选择vector容器是因为:

  1. 内存连续:访问效率高,适合频繁遍历
  2. 动态扩容:无需预先确定联系人数量
  3. 丰富接口:提供了多种便捷的操作方法

代码实现

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 contacts;

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;

}

功能扩展建议

这个基础版本已经实现了通讯录的核心功能,但还有很大的改进空间:

  1. 持久化存储:将数据保存到文件,程序重启后仍然可用
  2. 高级搜索:支持多条件组合查询
  3. 分组管理:为联系人添加分组标签
  4. 数据验证:检查电话号码和邮箱格式是否合法
  5. 界面美化:使用更友好的用户界面

性能优化考虑

虽然vector在大多数情况下表现良好,但随着联系人数量增加,某些操作可能需要优化:

  1. 查找优化:可以考虑使用map或unordered_map辅助索引
  2. 内存管理:对于超大通讯录,可能需要考虑内存占用问题
  3. 批量操作:添加批量导入导出功能

总结

通过这个实践项目,我们展示了如何利用C++的vector容器构建一个功能完整的通讯录管理系统。vector的灵活性和高效性在这个场景中得到了充分体现。这个实现不仅可以帮助理解STL容器的使用,也为更复杂的系统开发奠定了基础。

编程学习最重要的是动手实践,希望这个示例能激发你更多的创意和想法!

朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/31974/(转载时请注明本文出处及文章链接)

评论 (0)