map<key,value>保存的一对pair ,其内部通过红黑树实现,查找效率非常高,用户插入数据后,系统会自动根据key值大小进行排序,当然,一些自定义的类需要自定义比较函数,例如仿函数,重载< , >操作符等。
//简单map容器初始化
void test02() {
//map存储的是一个pair
map<int, string>MyMap;
MyMap.insert(make_pair(1, "c++"));
MyMap.insert(pair<int, string>(2, "python"));
MyMap.insert(map<int, string>::value_type(3, "fortran"));
//以上三种没有区别,若再插入的pair中的key值与之前重复,则插入失败,否则插入成功
MyMap[4] = "java";//[]里放key值 ,该方法插入时若map中存在相同key值,则替换value值,否则直接插入
//迭代器进行遍历
for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) {
//it是指向pair的指针 it->first是key值 second是value值
cout << "key:" << it->first << " value:" << (*it).second << endl;
}
//-----------------------------------------------------------------
//看看Mymap[] 和MyMap.insert的区别
MyMap.insert(make_pair(1, "c"));
cout << "--------------------------------------------------------"<<endl;
cout << "插入make_pair(1, \"c\")后的遍历结果:" << endl;
for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) {
//it是指向pair的指针 it->first是key值 second是value值
cout << "key:" << it->first << " value:" << (*it).second << endl;
}
MyMap[1] = "c";
cout << "--------------------------------------------------------"<<endl;
cout<< "MyMap[1] = \"c\"后的遍历结果:" << endl;
for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) {
//it是指向pair的指针 it->first是key值 second是value值
cout << "key:" << it->first << " value:" << (*it).second << endl;
}
}
//map的查找
void test03() {
map<int, string>Map1;//map<key,value>
Map1.insert(make_pair(1, "anhui"));
Map1.insert(make_pair(2, "beijing"));
Map1.insert(make_pair(3, "shanghai"));
int j = Map1.count(1);//find参数是key值 返回key值是1的个数
int i = Map1.count(4);
for (map<int, string>::iterator it = Map1.begin(); it != Map1.end(); it++) {
cout << "key:" << it->first << " value:" << it->second << endl;
}
cout << "key=1的数据有" << j << "个" << endl;
cout << "key=4的数据有" << i << "个" << endl;
map<int, string>::iterator ptr = Map1.find(2);//find返回迭代器
if (ptr == Map1.end())
cout << "找不到key=2的值" << endl;
else
cout << "key=2的值的value为" << ptr->second << endl;
ptr = Map1.find(5);
if (ptr == Map1.end())
cout << "找不到key=5的值" << endl;
else
cout << "key=5的值的value为" << ptr->second << endl;
}
//map存储自定义的类
class Person{
public:
Person(int age, char gender, string name) :m_age(age), m_gender(gender), m_name(name) {};
friend bool operator <(const Person& p1, const Person& p2) {
return p1.m_age < p2.m_age;
}
friend ostream& operator<< (ostream& os, const Person& p) {
os << "age:" << p.m_age << " gender:" << p.m_gender << " name" << p.m_name ;
return os;
}
private:
int m_age;
char m_gender;
string m_name;
};
void test04() {
map<Person, string>m_map;
Person p1(15, 'b', "jack");
Person p2(19, 'g', "mike");
Person p3(20, 'g', "lucy");
Person p4(28, 'b', "joshon");
m_map[p1] = "CHN";
m_map[p2] = "JAPAN";
m_map[p3] = "CANADA";
m_map.insert(make_pair(p4, "KOREAN"));
for (map<Person, string>::iterator it = m_map.begin(); it != m_map.end(); it++) {
cout << "PERSION " << it->first << " REGION " << it->second<<endl;
}
//执行m_map.insert()的返回值 返回一个pair, pair.first 是与当前map类型一致,pair.second是bool值 ,插入成功是true ,否则false
pair < map<Person, string>::iterator, bool > ptr = m_map.insert(make_pair(p2, "CHN"));
if (ptr.second == false)
cout << "make_pair(p2, \"CHN\")插入失败";
else
cout << "make_pair(p2, \"CHN\")插入成功";
}