C++中的map使用方法详解

 更新时间:2023年05月05日 10:05:46   作者:码出世界的淡水鱼  
C++中的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()方法进行范围查找。

map的遍历操作

我们可以使用迭代器来遍历map中的元素。以下示例展示了如何使用迭代器遍历map:

#include <iostream>
#include <map>

using namespace std;

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

    // 输出map中的元素
    for (auto it = myMap.begin(); it != myMap.end(); ++it) {
        cout << it->first << " : " << it->second << endl;
    }
    
    return 0;
}

输出:

apple : 1
banana : 2
cherry : 3

在上面的示例中,我们使用迭代器遍历map中的所有元素,并输出每个键值对。

在map中使用自定义比较器排序

默认情况下,map按键的升序进行排序。如果我们要按照其他方式进行排序,我们可以使用一个自定义比较器来指定排序的规则。以下示例展示了如何使用自定义比较器按值进行排序:

#include <iostream>
#include <map>

using namespace std;

bool myComp(const pair<string, int>& a, const pair<string, int>& b) {
    return a.second > b.second;
}

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

    // 按值排序
    vector<pair<string, int>> vec(myMap.begin(), myMap.end());
    sort(vec.begin(), vec.end(), myComp);

    // 输出排序后的结果
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        cout << it->first << " : " << it->second << endl;
    }
    
    return 0;
}

输出:

cherry : 3
banana : 2
apple : 1

在上面的示例中,我们定义了一个自定义比较器函数myComp来按值对map进行排序。然后,我们将map中的键值对存储在一个vector中,并使用自定义比较器来进行排序。最后,我们遍历已排序的vector并输出相应的键值对。

使用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++中非常有用和高效的数据结构,值得程序员们的深入学习和掌握。

到此这篇关于C++中的map使用方法详解的文章就介绍到这了,更多相关C++ map内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言判断数是否为素数与素数输出

    C语言判断数是否为素数与素数输出

    大家好,本篇文章主要讲的是C语言判断数是否为素数与素数输出,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C++代码实现扫雷游戏

    C++代码实现扫雷游戏

    这篇文章主要为大家详细介绍了C++代码实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • c语言实现计算圆周率的近似值

    c语言实现计算圆周率的近似值

    这篇文章主要介绍了c语言实现计算圆周率的近似值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 利用Matlab制作一个贼简单的粒子圣诞树

    利用Matlab制作一个贼简单的粒子圣诞树

    圣诞节快到了,本文用Matlab绘制了圣诞树祝你们圣诞节快乐,所以下面这篇文章主要给大家介绍了关于如何利用Matlab制作一个贼简单的粒子圣诞树,需要的朋友可以参考下
    2022-12-12
  • C 字符串数组排序的小例子

    C 字符串数组排序的小例子

    C 字符串数组排序的小例子,需要的朋友可以参考一下
    2013-03-03
  • C++类与对象的详细说明2

    C++类与对象的详细说明2

    这篇文章主要为大家详细介绍了C++的类与对象,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++20 新特性 协程 Coroutines(2)

    C++20 新特性 协程 Coroutines(2)

    上篇文章简单给大介绍了 C++20 特性 协程 Coroutines co_yield 和 co_return 那么这篇文章继续给大家介绍C++20 的新特性协程 Coroutines co_await,需要的朋友可以参考一下
    2021-10-10
  • C++算法学习之回溯法的应用

    C++算法学习之回溯法的应用

    这篇文章介绍了C++算法中回溯法的一些应用,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C++之构造函数默认值设置方式

    C++之构造函数默认值设置方式

    这篇文章主要介绍了C++之构造函数默认值设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • OpenGL实现鼠标移动方块

    OpenGL实现鼠标移动方块

    这篇文章主要为大家详细介绍了OpenGL实现鼠标移动方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08

最新评论