C++中map的使用方法

简介: map是一种使用键值对的数据结构,它允许我们使用键来查找值。map中的键必须是唯一且有序的,而值可以重复并且没有特定的顺序。map中的数据以树结构进行组织,其中每个节点都由一个键和一个值组成。根据键的大小,节点被插入到正确的位置以保持树的有序性。这使得在map中查找值非常高效,因为我们可以使用二分查找来快速定位值。

C++中的map是一种关联容器,用于存储键值对。它提供了一种非常高效的方法来快速查找特定的值,并且允许我们根据键来排序和遍历数据。

C++中的map

map的介绍

map是一种使用键值对的数据结构,它允许我们使用键来查找值。map中的键必须是唯一且有序的,而值可以重复并且没有特定的顺序。

map中的数据以树结构进行组织,其中每个节点都由一个键和一个值组成。根据键的大小,节点被插入到正确的位置以保持树的有序性。这使得在map中查找值非常高效,因为我们可以使用二分查找来快速定位值。

创建和初始化map

我们可以使用C++标准库中的map头文件来创建和初始化一个map。以下示例展示了如何创建一个map并将几个键值对添加到其中:

#include <iostream>
#include <map>
using namespace std;
int main()
{
    // 创建一个空的map
    map<int, string> myMap;
    // 向map中添加键值对
    myMap.insert(pair<int, string>(1, "apple"));
    myMap.insert(pair<int, string>(2, "banana"));
    myMap.insert(pair<int, string>(3, "cherry"));
    // 输出map中的元素
    for (auto it = myMap.begin(); it != myMap.end(); ++it) {
        cout << it->first << " : " << it->second << endl;
    }
    return 0;
}

输出:

1 : apple
2 : banana
3 : cherry

在上面的示例中,我们首先创建了一个空的map,然后使用insert()函数将一些键值对添加到其中。最后,我们使用迭代器遍历该map并输出每个键值对。

我们还可以使用初始化列表来初始化map。以下示例展示了如何使用初始化列表来创建并初始化一个map:

map<string, int> myMap {
    {"apple", 1},
    {"banana", 2},
    {"cherry", 3}
};

map中的查找操作

向map中添加元素后,我们可以使用其键来查找相应的值。使用find()方法可以在map中查找给定键的值。如果键存在,则find()方法返回指向该元素的迭代器。否则,它将返回指向map结尾的迭代器。

以下示例展示了如何在map中查找值:

#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<string, int> myMap {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3}
    };
    // 在map中查找元素
    auto it = myMap.find("apple");
    if (it != myMap.end()) {
        cout << "apple is found" << endl;
    } else {
        cout << "apple is not found" << endl;
    }
    it = myMap.find("pear");
    if (it != myMap.end()) {
        cout << "pear is found" << endl;
    } else {
        cout << "pear is not found" << endl;
    }
    return 0;
}

输出:

apple is found
pear is not found

在上面的示例中,我们首先创建了一个map并向其中添加了一些键值对。然后,我们使用find()方法在map中查找给定的键,如果找到则输出相应的消息。

map的删除操作

我们可以使用erase()方法从map中删除元素。erase()函数需要一个迭代器作为参数,可以使用find()方法查找迭代器,然后使用erase()方法来删除元素。以下示例展示了如何从map中删除特定键值对:

#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<string, int> myMap {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3}
    };
    // 删除map中的某个元素
    auto it = myMap.find("apple");
    if (it != myMap.end()) {
        myMap.erase(it);
    }
    // 输出map中的元素
    for (auto it = myMap.begin(); it != myMap.end(); ++it) {
        cout << it->first << " : " << it->second << endl;
    }
    return 0;
}

输出:

banana : 2
cherry : 3

在上面的示例中,我们首先创建了一个map并向其中添加了一些键值对。然后,我们使用find()方法查找要删除的元素

接下来我们来看看如何在map中遍历元素、如何使用自定义比较器排序map,以及如何使用lower_bound()和upper_bound()方法进行范围查找。

使用lower_bound()和upper_bound()进行范围查找

我们可以使用lower_bound()和upper_bound()方法来查找map中一定范围内的键值对。lower_bound()函数返回指向第一个大于等于给定键的元素的迭代器,而upper_bound()函数返回指向第一个大于给定键的元素的迭代器。

以下示例展示了如何使用lower_bound()和upper_bound()方法查找map中给定范围的键值对:

#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<string, int> myMap {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3},
        {"date", 4},
        {"elderberry", 5}
    };
    // 查找范围内的元素
    auto itlow = myMap.lower_bound("b");
    auto itup = myMap.upper_bound("d");
    // 输出找到的元素
    for (auto it = itlow; it != itup; ++it) {
        cout << it->first << " : " << it->second << endl;
    }
    return 0;
}

输出:

banana : 2
cherry : 3

在上面的示例中,我们首先创建了一个map并向其中添加一些键值对。然后,我们使用lower_bound()和upper_bound()方法查找键值在范围内的元素。最后,我们遍历找到的元素并输出它们的键值对。

总结:

在本文中,我们了解了C++中的map。map是一种关联容器,可以快速查找给定键的值。我们还展示了如何创建和初始化map、如何在map中查找、删除元素、遍历map以及如何使用自定义比较器和范围查找方法。map是C++中非常有用和高效的数据结构,值得程序员们的深入学习和掌握。

相关文章
|
1月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
33 3
【C++】map、set基本用法
|
1月前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
23 5
|
1月前
|
存储 C++ 容器
【C++】map的模拟实现
C++中的`map`是STL中的一种关联容器,存储键值对且键唯一。`map`基于红黑树实现,自动按键排序,支持动态调整、复杂数据类型、丰富的成员函数及双向迭代器。插入、查找等操作保证了对数时间复杂度,适用于需要快速查找和有序存储的场景。
24 3
|
4月前
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
5月前
|
C++ 容器
【C++】map和set封装
【C++】map和set封装
44 2
|
5月前
|
存储 C++ 容器
【C++】map和set深度讲解(下)
【C++】map和set深度讲解(下)
70 2
|
5月前
|
存储 自然语言处理 Java
【C++】map和set深度讲解(上)
【C++】map和set深度讲解(上)
54 2
|
5月前
|
存储 算法 C++
C++一分钟之-扁平化映射与unordered_map
【7月更文挑战第5天】C++的STL `unordered_map`是键值对的快速查找容器,基于哈希表。常见问题包括哈希函数选择、键类型限制、内存管理和迭代顺序不确定性。要避免问题,需优化哈希函数,确保自定义类型支持哈希和比较操作,合理管理内存,不依赖迭代顺序。提供的代码示例展示了如何为自定义类型定义哈希函数并操作`unordered_map`。正确使用能提升代码效率。
60 0
C++一分钟之-扁平化映射与unordered_map
|
5月前
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
128 0
|
5月前
|
存储 C++ 索引