> 文章列表 > map容器(重要)

map容器(重要)

map容器(重要)

1、map容器简介

Map容器中所有的元素都会根据元素的键值自动实现排序。Map中所有的元素都是pair,pair的简介
同时拥有实值和键值,而前面的 set 只是拥有 键值,pair 中的 第一个元素是键值,而第二个值是 实值。Map 中是不允许有两个相同的键值的,就像一个学校中一样,学生的学号就是键值,而学号对应的学生的具体信息就是实值。而且,我们不能通过Map 的迭代器改变map的键值,因为map 的键值关系到 map 元素的排列规则,任意改变map 的键值将会严重破坏 map 的组织。但是修改键值所对应的实值是可以的,Map 和 list 拥有相同的某些性质,当对它容器中的元素进行插入或者删除的时候,操作之前的所有迭代器,在操作完成之后依然是有效的,当然那个被删除元素的迭代器必然是一个例外。Multilmap 和 map 的操作类似,唯一的区别是 multimap 的键值是可以重复的,Map 和 multimap 的底层都是以 红黑树为实现机制的
Map的键值是不能修改的,因为它是根据键值来实现排序的

2、Map 容器 API 操作

建立 Person 类

#include <iostream>
#include <map>
using namespace std;
class Person
{friend void test01();friend void printMapAll(map<int, Person> &m);
private:int num;string name;float score;
public:Person(){}Person(int num,string name, float score);
};Person::Person(int num, string name, float score)
{this->num = num;this->name = name;this->score = score;
}

打印学生信息

void printMapAll(map<int, Person> &m)
{map<int, Person>::const_iterator it;for(it=m.begin(); it!=m.end();it++){//(*it) ==pair<int, Person>cout<<"学号:"<<(*it).first<<" 姓名:"<<(*it).second.name<<" \\
分数:"<<(*it).second.score<<endl;}
}

test01函数实现 Map 对应的 API 操作

void test01()
{//Map和set一样唯一的插入方式,不能同时插入 n 个一样的构造函数,因为键值不能重复,所以只能用这种方式插入 map<int, Person> m;//方式1:m.insert(pair<int,Person>(103, Person(103,"lucy", 88.8f)));//方式2:推荐m.insert(make_pair(101,Person(101,"bob", 77.7f)));//方式3:m.insert( map<int, Person>::value_type( 102 , Person(102,"tom", 66.6f)));//方式4:m[104] = Person(104,"德玛", 99.9f);printMapAll(m);//假如key值存在  m[key]代表对应的实值,但是最好不要这么访问操作,因为要是 键值 107 不存在,就会添加一个学生信心,所以不推荐使用这种方式访问 cout<< m[107].num<<" "<<m[107].name<<" "<<m[107].score<<endl;cout<<"----------使用m[107].num产生问题------------"<<endl;printMapAll(m);m.erase(104);       //可以删除迭代器,也可以删除元素 cout<<"----------"<<endl;printMapAll(m);//查找key为103的数据map<int, Person>::const_iterator ret;ret = m.find(103);      //find的返回值是当前容器Map的迭代器 if(ret != m.end()){//*ret == pair<int,Person>cout<<(*ret).first<<" "<<(*ret).second.name<<" "<<(*ret).second.score<<endl;}
}

主函数调用 test01


int main(int argc, char *argv[])
{test01();return 0;
}

——————————————————————————————————————————————
所有代码如下
#include
#include

using namespace std;
class Person
{
friend void test01();
friend void printMapAll(map<int, Person> &m);
private:
int num;
string name;
float score;
public:
Person(){}
Person(int num,string name, float score);
};

Person::Person(int num, string name, float score)
{
this->num = num;
this->name = name;
this->score = score;
}

void printMapAll(map<int, Person> &m)
{
map<int, Person>::const_iterator it;
for(it=m.begin(); it!=m.end();it++)
{
//(*it) ==pair<int, Person>
cout<<“学号:”<<(*it).first<<" 姓名:“<<(*it).second.name<<”
分数:"<<(*it).second.score<<endl;
}
}

void test01()
{
//Map和set一样唯一的插入方式,不能同时插入 n 个一样的构造函数,因为键值不能重复,所以只能用这种方式插入
map<int, Person> m;
//方式1:
m.insert(pair<int,Person>(103, Person(103,“lucy”, 88.8f)));
//方式2:推荐
m.insert(make_pair(101,Person(101,“bob”, 77.7f)));
//方式3:
m.insert( map<int, Person>::value_type( 102 , Person(102,“tom”, 66.6f)));
//方式4:
m[104] = Person(104,“德玛”, 99.9f);

printMapAll(m);

//假如key值存在 m[key]代表对应的实值,但是最好不要这么访问操作,因为要是 键值 107 不存在,就会添加一个学生信心,所以不推荐使用这种方式访问
cout<< m[107].num<<" “<<m[107].name<<” "<<m[107].score<<endl;

cout<<“----------使用m[107].num产生问题------------”<<endl;
printMapAll(m);

m.erase(104); //可以删除迭代器,也可以删除元素
cout<<“----------”<<endl;
printMapAll(m);

//查找key为103的数据
map<int, Person>::const_iterator ret;
ret = m.find(103); //find的返回值是当前容器Map的迭代器
if(ret != m.end())
{
//*ret == pair<int,Person>
cout<<(*ret).first<<" “<<(*ret).second.name<<” "<<(*ret).second.score<<endl;
}
}

int main(int argc, char *argv[])
{
test01();
return 0;
}
——————————————————————————————————————————————
map容器(重要)