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

相关文章
|
8月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
238 2
|
8月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
465 73
|
5月前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
246 0
|
9月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
304 3
【C++】map、set基本用法
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
244 5
|
存储 C++ 容器
【C++】map的模拟实现
C++中的`map`是STL中的一种关联容器,存储键值对且键唯一。`map`基于红黑树实现,自动按键排序,支持动态调整、复杂数据类型、丰富的成员函数及双向迭代器。插入、查找等操作保证了对数时间复杂度,适用于需要快速查找和有序存储的场景。
170 3
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
172 0
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
229 2
|
9月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。

热门文章

最新文章