STL中的multimap与map比较
主要区别
特性 map multimap
键唯一性 每个键只能出现一次 允许重复键
operator[] 支持 不支持
插入操作 插入重复键会失败 总是可以插入
访问方式 可直接通过键访问值 需要特殊方法处理多值
使用示例
- map示例(键唯一)
#include<iostream>#include<map>#include<string>intmain(){std::map<int,std::string>studentMap;// 插入元素studentMap[101]="Alice";studentMap[102]="Bob";studentMap[103]="Charlie";// 尝试插入重复键(会覆盖原有值)studentMap[102]="Bob Updated";// 覆盖原来的"Bob"// 使用insert(不会覆盖)studentMap.insert({104,"David"});autoresult=studentMap.insert({101,"Alice Duplicate"});// 插入失败,键已存在std::cout<<"Insert 101 again? "<<(result.second?"Success":"Failed")<<"\n";// 遍历for(constauto&pair:studentMap){std::cout<<"ID: "<<pair.first<<", Name: "<<pair.second<<"\n";}// 直接通过键访问std::cout<<"Student 102: "<<studentMap[102]<<"\n";return0;}- multimap示例(允许重复键)
#include<iostream>#include<map>#include<string>intmain(){std::multimap<std::string,std::string>courses;// 插入元素(允许重复键)courses.insert({"Math","Algebra"});courses.insert({"Math","Calculus"});courses.insert({"Physics","Mechanics"});courses.insert({"Math","Geometry"});// 再次插入"Math"键courses.insert({"Physics","Optics"});// 遍历所有元素std::cout<<"All courses:\n";for(constauto&course:courses){std::cout<<"Department: "<<course.first<<", Course: "<<course.second<<"\n";}// 查找特定键的所有值std::string target="Math";autorange=courses.equal_range(target);std::cout<<"\nAll Math courses:\n";for(autoit=range.first;it!=range.second;++it){std::cout<<it->second<<"\n";}// 统计特定键的数量std::cout<<"\nNumber of Math courses: "<<courses.count("Math")<<"\n";// 注意:multimap不支持operator[]// courses["Math"] = "New Course"; // 错误!无法编译return0;}实际应用场景
场景1:电话簿(一人有多个电话)
#include<iostream>#include<map>#include<vector>intmain(){// multimap实现:一人可以有多个电话std::multimap<std::string,std::string>phonebook;phonebook.insert({"Alice","123-4567"});phonebook.insert({"Alice","987-6543"});phonebook.insert({"Bob","555-1234"});phonebook.insert({"Alice","111-2222"});// 查找Alice的所有电话autoalicePhones=phonebook.equal_range("Alice");std::cout<<"Alice's phone numbers:\n";for(autoit=alicePhones.first;it!=alicePhones.second;++it){std::cout<<" "<<it->second<<"\n";}return0;}场景2:使用map模拟multimap功能
#include<iostream>#include<map>#include<vector>#include<string>intmain(){// 使用map<string, vector<string>>实现类似multimap功能std::map<std::string,std::vector<std::string>>studentCourses;// 添加课程studentCourses["Alice"].push_back("Math");studentCourses["Alice"].push_back("Physics");studentCourses["Bob"].push_back("Chemistry");studentCourses["Alice"].push_back("Computer Science");// 访问Alice的所有课程std::cout<<"Alice's courses:\n";for(constauto&course:studentCourses["Alice"]){std::cout<<" "<<course<<"\n";}return0;}常用方法对比
操作 map multimap
插入 insert() 或 operator[] 只能使用 insert()
查找 find() 返回单个迭代器 equal_range() 返回迭代器对
删除 erase(key) 删除一个元素 erase(key) 删除所有匹配键的元素
计数 count() 返回0或1 count() 返回键出现的次数
选择建议
· 使用map:当需要键值对且键是唯一的,或者需要通过键快速查找/修改值
· 使用multimap:当键可能重复,且需要维护所有关联值
· 考虑替代方案:有时 map<Key, vector> 可能比multimap更方便,特别是需要随机访问特定键的所有值时
两种容器都基于红黑树实现,提供了O(log n)的查找、插入和删除操作。