C++ 学习之Map容器

简介: C++ 学习之Map容器

C++ Map容器概念

C++的Map容器是一种关联容器,它提供了一种将键和值相关联的方式。它以键值对的形式存储数据,并根据键的顺序自动进行排序。

Map中的键是唯一的,而值可以重复。你可以使用键来访问对应的值,就像使用索引访问数组中的元素一样。

Map容器的特点如下:

  1. 按照键的顺序进行自动排序。
  2. 使用红黑树实现,因此插入、删除和查找操作的平均时间复杂度为O(logN)。
  3. 可以使用自定义的比较函数来指定键的排序方式。
  4. 提供了丰富的成员函数和操作符,用于对容器进行操作,如插入、删除、查找、遍历等。
  5. 容器的大小随着元素的插入和删除而动态变化,没有固定大小限制。

以下是一个简单的示例代码演示如何使用Map容器:

#include <iostream>
#include <map>
int main() {
    std::map<int, std::string> students;  // 声明一个Map容器
    // 插入键值对
    students.insert(std::pair<int, std::string>(1, "Alice"));
    students.insert(std::pair<int, std::string>(2, "Bob"));
    students.insert(std::pair<int, std::string>(3, "Charlie"));
    // 使用迭代器遍历Map容器
    for (auto it = students.begin(); it != students.end(); ++it) {
        std::cout << "学号: " << it->first << ", 姓名:" << it->second << std::endl;
    }
    // 访问特定键的值
    std::cout << "学号为2的学生姓名: " << students[2] << std::endl;
    // 删除特定键值对
    students.erase(1);
    // 检查某个键是否存在
    if (students.find(1) == students.end()) {
        std::cout << "学号为1的学生不存在" << std::endl;
    }
    return 0;
}

例子创建了一个Map容器,以学号为键、姓名为值。然后插入了三个键值对,并使用迭代器遍历容器的内容。通过特定键访问对应的值,并删除了学号为1的学生。最后,检查学号为1的学生是否存在。

C++ Map容器构造和赋值

在C++中,Map容器可以通过多种方式进行构造和赋值。以下是几种常见的构造和赋值方法:

  1. 使用默认构造函数创建空的Map容器:
std::map<int, std::string> students;
  1. 使用初始化列表构造Map容器并插入元素:
std::map<int, std::string> students = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
  1. 使用迭代器范围构造Map容器:
std::map<int, std::string> students;
std::vector<std::pair<int, std::string>> studentList = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
students.insert(studentList.begin(), studentList.end());
  1. 使用拷贝构造函数进行复制:
std::map<int, std::string> students1 = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
std::map<int, std::string> students2(students1);
  1. 使用赋值运算符进行赋值操作:
std::map<int, std::string> students1 = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
std::map<int, std::string> students2;
students2 = students1;

C++ Map容器大小和交换

在C++中,Map容器提供了几个与大小和交换相关的成员函数,可以帮助你获取容器的大小以及交换两个容器的内容。下面是关于Map容器大小和交换的一些常用操作:

  1. 获取Map容器中元素的数量(大小):
std::map<int, std::string> students = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
std::cout << "Map容器中的元素数量为:" << students.size() << std::endl;
  1. 判断Map容器是否为空:
if (students.empty()) {
    std::cout << "Map容器为空" << std::endl;
} else {
    std::cout << "Map容器不为空" << std::endl;
}
  1. 交换两个Map容器的内容:
std::map<int, std::string> students1 = {{1, "Alice"}, {2, "Bob"}};
std::map<int, std::string> students2 = {{3, "Charlie"}, {4, "David"}};
students1.swap(students2);
// 打印交换后的结果
for (const auto& student : students1) {
    std::cout << "学号: " << student.first << ", 姓名:" << student.second << std::endl;
}
for (const auto& student : students2) {
    std::cout << "学号: " << student.first << ", 姓名:" << student.second << std::endl;
}

以上代码展示了如何获取Map容器的大小、判断容器是否为空以及交换两个Map容器的内容。你可以根据自己的需求使用这些成员函数来操作Map容器。

C++ Map容器插入和删除

在C++中,Map容器提供了多种方法来插入和删除元素。以下是关于Map容器插入和删除操作的示例代码:

  1. 插入元素:
std::map<int, std::string> students;
// 使用insert函数插入元素
students.insert(std::make_pair(1, "Alice"));
students.insert(std::pair<int, std::string>(2, "Bob"));
// 使用下标运算符插入元素
students[3] = "Charlie";
  1. 删除元素:
std::map<int, std::string> students = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
// 使用erase函数删除指定键的元素
students.erase(1);
// 使用迭代器遍历容器并删除特定条件的元素
for (auto it = students.begin(); it != students.end();) {
    if (it->second == "Bob") {
        it = students.erase(it);
    } else {
        ++it;
    }
}

示例中,展示了如何使用insert函数和下标运算符向Map容器中插入元素,以及如何使用erase函数删除指定键的元素。同时,也展示了如何结合迭代器遍历Map容器,并根据特定条件删除元素。这些方法可以根据需要灵活使用,来对Map容器进行元素的插入和删除操作。

C++ Map容器查找和统计

在C++中,Map容器提供了几种方法来查找元素并进行统计。以下是关于Map容器查找和统计操作的示例代码:

  1. 查找元素:
std::map<int, std::string> students = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
// 使用find函数查找元素
auto it = students.find(2);
if (it != students.end()) {
    std::cout << "学号为2的学生姓名是:" << it->second << std::endl;
} else {
    std::cout << "未找到学号为2的学生" << std::endl;
}
  1. 统计特定键值出现的次数:
std::map<int, std::string> students = {{1, "Alice"}, {2, "Bob"}, {3, "Alice"}, {4, "Alice"}};
int count = 0;
std::string targetName = "Alice";
for (const auto& student : students) {
    if (student.second == targetName) {
        count++;
    }
}
std::cout << targetName << " 出现的次数为:" << count << std::endl;

在上面的示例中,展示了如何使用find函数在Map容器中查找特定键对应的值,并输出该值。同时,也展示了如何统计Map容器中特定值出现的次数。通过结合迭代器遍历容器,可以快速并灵活地实现查找和统计操作。根据实际情况,你可以分别根据需求调用find函数和自定义统计逻辑来满足不同的需求。

C++ Map容器容器排序

在C++的Map容器中,元素是按照键的升序排列的。Map本身是基于红黑树(Red-Black Tree)实现的,会自动根据键值进行排序。如果需要按照值进行排序,可以考虑将Map中的键值对转换为vector,然后对vector进行排序。以下是一个示例代码:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
bool sortByValue(const std::pair<int, std::string>& a, const std::pair<int, std::string>& b) {
    return a.second < b.second;
}
int main() {
    std::map<int, std::string> students = {{1, "Alice"}, {2, "Bob"}, {3, "Charlie"}};
    // 将Map的键值对存入vector
    std::vector<std::pair<int, std::string>> studentVector(students.begin(), students.end());
    // 按值排序vector
    std::sort(studentVector.begin(), studentVector.end(), sortByValue);
    // 输出排序后的结果
    for (const auto& student : studentVector) {
        std::cout << "学号: " << student.first << ", 姓名: " << student.second << std::endl;
    }
    return 0;
}

示例中,首先将Map中的键值对存入vector,然后定义一个比较函数sortByValue,用来按照值排序vector。最后使用std::sort函数对vector进行排序,并输出排序后的结果。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

相关文章
|
2月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
81 2
|
2月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
172 73
|
3月前
|
存储 缓存 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 的奥秘,从入门到高效编程
|
4月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
88 16
|
5月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
126 4
2023/11/10学习记录-C/C++对称分组加密DES
|
6月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
142 3
【C++】map、set基本用法
|
6月前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
84 5
|
6月前
|
存储 C++ 容器
【C++】map的模拟实现
C++中的`map`是STL中的一种关联容器,存储键值对且键唯一。`map`基于红黑树实现,自动按键排序,支持动态调整、复杂数据类型、丰富的成员函数及双向迭代器。插入、查找等操作保证了对数时间复杂度,适用于需要快速查找和有序存储的场景。
99 3
|
7月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
176 6
|
6月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
101 0

热门文章

最新文章