STL之map/multimap容器
1. map/multimap基本概念
Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。
我们可以通过map的迭代器改变map的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。
Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。
Multimap和map的操作类似,唯一区别multimap键值可重复。
Map和multimap都是以红黑树为底层实现机制。
2. map/multimap常用API
2.1 map构造函数
map<T1, T2> mapTT;//map默认构造函数: map(const map &mp);//拷贝构造函数
2.2 map赋值操作
map& operator=(const map &mp);//重载等号操作符 swap(mp);//交换两个集合容器
2.3 map大小操作
size();//返回容器中元素的数目 empty();//判断容器是否为空
2.5 map插入数据元素操作
map.insert(...); //往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu; // 第一种 通过pair的方式插入对象 mapStu.insert(pair<int, string>(3, "小张")); // 第二种 通过pair的方式插入对象 mapStu.inset(make_pair(-1, "校长")); // 第三种 通过value_type的方式插入对象 mapStu.insert(map<int, string>::value_type(1, "小李")); // 第四种 通过数组的方式插入值 mapStu[3] = "小刘"; mapStu[5] = "小王";
2.6 map删除操作
clear();//删除所有元素 erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。 erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。 erase(keyElem);//删除容器中key为keyElem的对组。
2.7 map查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end(); count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。 lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。 upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。 equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
代码示例:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<map> #include<string> using namespace std; void test() { map<int, string>m1; m1.insert(make_pair(1, "马 云")); m1.insert(make_pair(2, "任正非")); m1.insert(make_pair(3, "李彦宏")); m1.insert(make_pair(4, "马化腾")); m1.insert(make_pair(5, "张小虎")); for (map<int, string>::iterator it = m1.begin(); it != m1.end(); ++it) { cout << "ID:" << it->first << " 姓名:" << it->second << endl; } //m1.find(3)返回一个迭代器, if (m1.find(7) != m1.end()) { cout << "----------找到------------" << endl; cout << "ID:" << m1.find(3)->first << " 姓名:" << m1.find(3)->second << endl; } else { cout << "未找到" << endl; } } //3.8.2.6 map查找操作 //find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end(); //count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。 //lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。 //upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。 //equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。 void test01() { map<int, int>m; m.insert(make_pair(1, 10)); m.insert(make_pair(2, 20)); m.insert(make_pair(3, 30)); m.insert(make_pair(4, 40)); for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) { //打印key值 cout << "key:" << (*it).first << " value:" << it->second << endl; } //m.erase(key m.erase(3); cout << "----------删除后-------------" << endl; for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) { //打印key值 cout << "key:" << (*it).first << " value:" << it->second << endl; } } int main() { //test(); test01(); system("pause"); return EXIT_SUCCESS; }
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<map> #include<string> using namespace std; //公司今天招聘了5个员工,5名员工进入公司之后,需要指派员工在那个部门工作 //人员信息有: 姓名 年龄 电话 工资等组成 //通过Multimap进行信息的插入 保存 显示 //分部门显示员工信息 显示全部员工信息 //multimap //学生信息 class staff; //查找信息 void seek(map<int, staff> &M, int i); //打印信息 void myprint(map<int, staff> &m); //输入信息 void insermes(map<int, staff> &M); //删除信息 void deletemes(map<int, staff> &M, int ID); //学生信息 class staff { public: staff(){}; void setname(string name) { this->name = name; } void setage(int age) { this->age = age; } void setpone(long long pone) { this->pone = pone; } void setwage(int wage) { this->wage = wage; } staff(string name, int age, long long pone, int wage) { this->name = name; this->age = age; this->pone = pone; this->wage = wage; } string name; int age; long long pone; int wage; }; //打印信息 void myprint(map<int, staff> &m) { for (map<int, staff>::iterator it=m.begin(); it != m.end(); ++it) { cout << "ID:" << it->first << " 姓名:" << it->second.name << " 电话:" << it->second.pone << " 年龄:" << it->second.age << " 工资:" << it->second.wage << endl; } } //输入信息 void insermes(map<int, staff> &M) { int i = 1; int over = 1; cout << "结束输入请输入0" << endl; while (over) { //int ID; string name; long long pone; int wage; int age; //cout << "请输入学生编号:"; //cin >> ID; //cout << endl; cout << "请输入学生姓名:"; cin >> name; cout << "请输入学生年龄:"; cin >> age; if (age < 0 || age>200) { continue; } cout << "请输入电话:"; cin >> pone; cout << "请输入工资:"; cin >> wage; cout << "你输入的是" << " 姓名:" << name << " 电话:" << pone << " 年龄:" << age << " 工资:"<<wage<<endl; //staff(string name, int age, long long pone, int wage) staff p1; p1.setname(name); p1.setage(age); p1.setpone(pone); p1.setwage(wage); M.insert(make_pair(i, p1)); ++i; cin >> over; if (over == 0) { over = 0; } else { over = 1; } } } //查找信息 void seek(map<int, staff> &M,int i) { if (M.find(i) != M.end()) { cout << "找到" << endl; if (M.find(i) != M.end()) { cout << "ID:" << M.find(i)->first << " 姓名:" << M.find(i)->second.name << " 电话:" << M.find(i)->second.pone << " 年龄:" << M.find(i)->second.age << " 工资:" << M.find(i)->second.wage<< endl; } } } //删除信息 void deletemes(map<int, staff> &M,int ID) { M.erase(ID); } void test01() { map<int, staff> M; insermes(M); myprint(M); seek(M, 2); deletemes(M, 2); myprint(M); } int main(){ //test(); test01(); system("pause"); return EXIT_SUCCESS; }

浙公网安备 33010602011771号