Map/Multimap 映射容器属于关联容器,它的每个键对应着每个值,容器的数据结构同样采用红黑树进行管理,插入的键不允许重复,但值是可以重复的,如果使用Multimap
声明映射容器,则同样可以插入相同的键值。
Map中的所有元素都会根据元素的键值自动排序,所有的元素都是一个Pair
同时拥有实值和键值,Pair的第一个元素被视为键值,第二个元素则被视为实值,Map 容器中不允许两个元素有相同的键出现。
6.1 通过对组实现键值对
这段代码演示了C++中标准库中pair
和set
的用法。pair是一个用来存储一对值的数据类型,可以用来表示关联数组或者键值对。set是一个用来存储不重复元素的集合,其内部自动对元素进行排序,具体排序方式由元素类型的比较函数定义。
代码中首先创建了两个pair
对象p和p2,分别用string
和int
类型的值进行初始化。接着创建了一个set对象var,用来存储int类型的元素。由于set中不能存在重复的元素,所以在插入元素10时,因为之前已经插入过10,所以插入失败,返回了一个pair
对象,其中second
为false,表示插入失败。最后程序暂停等待用户操作,防止程序退出。
#include <iostream> #include <set> #include <string>
using namespace std;
int main(int argc, char* argv[]) { pair<string, int> p(string("lyshark"), 100); pair<string, int> p2 = make_pair("jerry", 200); cout << "Name: " << p.first << endl; cout << "Age: " << p.second << endl;
set<int> var; var.insert(10); pair<set<int>::iterator, bool> ret = var.insert(10); if (!ret.second) cout << "insert error" << endl;
system("pause"); return 0; }
|
6.2 正反向遍历映射容器
这段代码演示了如何使用C++ STL中的map
容器,其中包括了map的插入、删除、正向遍历、反向遍历等常用操作。其中,map是一种键值对映射容器,通过key
可以快速查找value。本代码中使用了三种方式实现了map容器的插入操作,分别是insert
函数、make_pair
函数、数组形式。在插入之后,使用erase
函数删除了其中的一个键值对。正向遍历和反向遍历分别使用了map的迭代器和反向迭代器。
#include <iostream> #include <map> #include <string>
using namespace std;
int main(int argc, char* argv[]) { map<string, int> mp; mp.insert(pair<string, int>("admin0", 100)); mp.insert(make_pair("admin1", 200)); mp["admin2"] = 300;
mp.erase("admin2");
for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++) cout << "key = " << it->first << " --> value = " << it->second << endl;
cout << endl; for (map<string, int>::reverse_iterator it = mp.rbegin(); it != mp.rend();it ++) cout << "key = " << it->first << " --> value = " << it->second << endl; system("pause"); return 0; }
|
6.3 查找映射容器中的元素
这段代码实现了使用STL库中的map类型来存储一组键值对,其中键是字符串类型,值是整数类型。代码中演示了如何使用map的find
、lower_bound
、upper_bound
方法来查找指定的键值对,分别返回该元素的迭代器、第一个大于等于该元素的迭代器和第一个大于该元素的迭代器。
#include <iostream> #include <map> #include <string>
using namespace std;
int main(int argc, char* argv[]) { map<string, int> mp;
mp["admin0"] = 100; mp["admin1"] = 200; mp["admin2"] = 300; map<string, int>::iterator pos = mp.find("admin0"); if (pos != mp.end()) cout << "key = " << pos->first << " --> value = " << pos->second << endl;
map<string, int>::iterator ret = mp.lower_bound("admin0"); if (ret != mp.end()) cout << "lower_bound key = " << ret->first << " --> lower_bound value = " << ret->second << endl; map<string, int>::iterator ret1 = mp.upper_bound("admin0"); cout << "upper_bound key = " << ret1->first << " --> upper_bound value = " << ret1->second << endl; system("pause"); return 0; }
|
6.4 遍历映射容器中的结构
这段代码是一个使用STL的map容器存储学生信息的示例程序,其中使用了结构体来存储学生信息。在主函数中,首先将三个学生信息存储到一个StudentRecord
数组中,然后通过将这些学生信息放入map容器中,实现将学生信息与其对应的ID关联起来。接着,通过迭代器遍历整个map容器,将每个学生的ID和姓名输出到屏幕上。最后,通过使用map容器的find
方法,查找学生ID为1的学生信息,并将其姓名输出到屏幕上。
#include <iostream> #include <map> #include <string>
using namespace std;
struct StudentInfo{ char *name; int year; char *addr; };
struct StudentRecord{ int id; StudentInfo stu; };
int main(int argc, char* argv[]) { StudentRecord szArray[] = { { 1, "admin0", 22, "beijing" }, { 2, "admin1", 33, "shanghai" }, { 3, "admin2", 24, "jinan" }, }; map<int, StudentInfo> mp;
for (int x = 0; x < 3; x++) { mp[szArray[x].id] = szArray[x].stu; } map<int, StudentInfo>::iterator start, end; end = mp.end(); for (start = mp.begin(); start != end; start++) cout << "ID: " << (*start).first << " --> Name: " << (*start).second.name << endl;
map<int, StudentInfo>::iterator i = mp.find(1); cout << "First: " << (*i).first << endl; cout << "Name: " << (*i).second.name << endl; system("pause"); return 0; }
|
6.5 通过映射容器实现分组
这段代码是一个员工分组的示例程序,通过随机生成5个员工成员,然后随机将这些员工分到三个部门中(人力、研发、美术),最后输出人力部门的员工名单。它使用了 vector
存储员工信息,使用multimap
存储分组信息,通过枚举类型和常量来定义部门编号,实现了分组和展示分组的功能。
#include <iostream> #include <vector> #include <string> #include <map>
using namespace std;
enum {RENLI,YANFA,MEISHU}; class Worker { public: string m_name; int m_money; };
void CreateWorker(vector<Worker> &v) { string nameSeed = "ABCDE"; Worker w; for (int x = 0; x < 5; x++) { string name; name += nameSeed[x]; int money = rand() % 10000+10000; w.m_name = name; w.m_money = money; v.push_back(w); } }
void ShowGroup(multimap<int, Worker> &m) { cout << "Group:" << endl; multimap<int,Worker>::iterator pos = m.find(RENLI); int index = 0; int num = m.count(RENLI); for (; pos != m.end(), index < num; pos++, index++) { cout << "Name: " << pos->second.m_name << endl; } }
void SetGroup(vector<Worker> &v,multimap<int,Worker> & m) { for (vector<Worker>::iterator it = v.begin(); it != v.end(); it++) { int departmentId = rand() % 3; m.insert(make_pair(departmentId, *(it))); } } int main(int argc, char* argv[]) { vector<Worker> v; CreateWorker(v); multimap<int, Worker> mp; SetGroup(v,mp); ShowGroup(mp);
system("pause"); return 0; }
|