C++之map/multimap容器

简介: C++之map/multimap容器

一、基本概念

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

相关文章
|
1月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
48 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
1月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
52 5
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
53 2
|
3月前
|
存储 C++ 索引
|
3月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
3月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
40 0
|
3月前
|
存储 缓存 NoSQL
【C++】哈希容器
【C++】哈希容器
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
25 4
|
30天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4