一、基本概念
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
二、构造和赋值
void printMap(map<int, int> &m) { for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) { cout << "key=" << (*it).first << " " << "vaule= " << it->second << endl; } cout << endl; } // map的构造和赋值 void test01() { // 创建容器 map<int, int> m1; m1.insert(pair<int, int>(2, 20)); m1.insert(pair<int, int>(1, 10)); m1.insert(pair<int, int>(3, 30)); m1.insert(pair<int, int>(4, 40)); m1.insert(pair<int, int>(5, 50)); printMap(m1); // 拷贝构造 map<int, int> m2(m1); printMap(m2); // 赋值 map<int, int> m3; m3 = m1; printMap(m3); }
三、map大小和交换
//map容器的大小和交换 void test02() { map<int, int> m1; m1.insert(pair<int, int>(2, 20)); m1.insert(pair<int, int>(1, 10)); m1.insert(pair<int, int>(3, 30)); m1.insert(pair<int, int>(4, 40)); m1.insert(pair<int, int>(5, 50)); map<int, int> m2; m2.insert(pair<int, int>(2, 200)); m2.insert(pair<int, int>(1, 100)); m2.insert(pair<int, int>(3, 300)); m2.insert(pair<int, int>(4, 400)); m2.insert(pair<int, int>(5, 500)); cout << "交换前:" << endl; printMap(m1); printMap(m2); cout << "m1的大小:" << m1.size() << endl; cout << "m1是否为空" << m1.empty() << endl; m1.swap(m2); cout << "交换后:" << endl; printMap(m1); printMap(m2); }
四、map插入和删除
//map插入和删除 void test03() { map<int, int> m1; // 插入 // 第一种 m1.insert(pair<int, int>(2, 20)); // 第二种 m1.insert(make_pair(1, 10)); // 第三种 m1.insert(map<int, int>::value_type(3, 30)); // 第四种 m1[4] = 40; printMap(m1); // 删除第一个 m1.erase(m1.begin()); printMap(m1); // 删除key为2的元素 m1.erase(2); printMap(m1); // 全部删除 m1.erase(m1.begin(), m1.end()); // 清空 m1.clear(); printMap(m1); }
五、map查找和统计
//map容器 查找和统计 void test04() { // 查找 map<int, int> m1; m1.insert(make_pair(1, 10)); m1.insert(make_pair(2, 20)); m1.insert(make_pair(3, 30)); m1.insert(make_pair(4, 40)); map<int, int>::iterator pos = m1.find(30); if (pos != m1.end()) { cout << "找到了" << endl; } else { cout << "没有找到" << endl; } // 查找key // 1 cout << m1.count(1) << endl; // 0 cout << m1.count(10) << endl; }
六、容器排序
//map排序 class MyCompare { public: bool operator()(int v1, int v2) const { return v1 > v2; } }; void test05() { map<int, int, MyCompare> m1; m1.insert(make_pair(1, 10)); m1.insert(make_pair(2, 20)); m1.insert(make_pair(3, 30)); m1.insert(make_pair(4, 40)); for (map<int, int, MyCompare>::const_iterator it = m1.begin(); it != m1.end(); it++) { cout << "key=" << (*it).first << " " << "vaule= " << it->second << endl; } cout << endl; }
七、全部代码
#include <iostream> #include <map> using namespace std; void printMap(map<int, int> &m) { for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) { cout << "key=" << (*it).first << " " << "vaule= " << it->second << endl; } cout << endl; } // map的构造和赋值 void test01() { // 创建容器 map<int, int> m1; m1.insert(pair<int, int>(2, 20)); m1.insert(pair<int, int>(1, 10)); m1.insert(pair<int, int>(3, 30)); m1.insert(pair<int, int>(4, 40)); m1.insert(pair<int, int>(5, 50)); printMap(m1); // 拷贝构造 map<int, int> m2(m1); printMap(m2); // 赋值 map<int, int> m3; m3 = m1; printMap(m3); } //map容器的大小和交换 void test02() { map<int, int> m1; m1.insert(pair<int, int>(2, 20)); m1.insert(pair<int, int>(1, 10)); m1.insert(pair<int, int>(3, 30)); m1.insert(pair<int, int>(4, 40)); m1.insert(pair<int, int>(5, 50)); map<int, int> m2; m2.insert(pair<int, int>(2, 200)); m2.insert(pair<int, int>(1, 100)); m2.insert(pair<int, int>(3, 300)); m2.insert(pair<int, int>(4, 400)); m2.insert(pair<int, int>(5, 500)); cout << "交换前:" << endl; printMap(m1); printMap(m2); cout << "m1的大小:" << m1.size() << endl; cout << "m1是否为空" << m1.empty() << endl; m1.swap(m2); cout << "交换后:" << endl; printMap(m1); printMap(m2); } //map插入和删除 void test03() { map<int, int> m1; // 插入 // 第一种 m1.insert(pair<int, int>(2, 20)); // 第二种 m1.insert(make_pair(1, 10)); // 第三种 m1.insert(map<int, int>::value_type(3, 30)); // 第四种 m1[4] = 40; printMap(m1); // 删除第一个 m1.erase(m1.begin()); printMap(m1); // 删除key为2的元素 m1.erase(2); printMap(m1); // 全部删除 m1.erase(m1.begin(), m1.end()); // 清空 m1.clear(); printMap(m1); } //map容器 查找和统计 void test04() { // 查找 map<int, int> m1; m1.insert(make_pair(1, 10)); m1.insert(make_pair(2, 20)); m1.insert(make_pair(3, 30)); m1.insert(make_pair(4, 40)); map<int, int>::iterator pos = m1.find(30); if (pos != m1.end()) { cout << "找到了" << endl; } else { cout << "没有找到" << endl; } // 查找key // 1 cout << m1.count(1) << endl; // 0 cout << m1.count(10) << endl; } //map排序 class MyCompare { public: bool operator()(int v1, int v2) const { return v1 > v2; } }; void test05() { map<int, int, MyCompare> m1; m1.insert(make_pair(1, 10)); m1.insert(make_pair(2, 20)); m1.insert(make_pair(3, 30)); m1.insert(make_pair(4, 40)); for (map<int, int, MyCompare>::const_iterator it = m1.begin(); it != m1.end(); it++) { cout << "key=" << (*it).first << " " << "vaule= " << it->second << endl; } cout << endl; } int main() { // test01(); // test02(); // test03(); // test04(); test05(); system("pause"); return 0; }
key=4 vaule= 40 key=3 vaule= 30 key=2 vaule= 20 key=1 vaule= 10