C++中的STL中map用法详解(零基础入门)

yizhihongxing

C++中的STL中map用法详解(零基础入门)

什么是map?

map 是 C++ 中的关联式容器,它可以存储 key-value 键值对,其中 key 是唯一的。在 map 中,keyvalue 可以是任何可比较的数据类型。

map 可以用于快速查找和插入数据。其内部实现是基于红黑树(一种自平衡的二叉查找树)的。

map的基本用法

map 定义格式:map<key_type, value_type> map_name

其中,key_typevalue_type 表示键值对中的 keyvalue 的数据类型。

// 声明一个string为key, int为value的map
#include <map>
#include <string>
using namespace std;

int main()
{
    map<string, int> student;
    return 0;
}

向 map 中插入键值对:

// 声明一个string为key, int为value的map
#include <map>
#include <string>
using namespace std;

int main()
{
    map<string, int> student;

    // 向 map 中插入键值对
    student.insert(pair<string, int>("张三", 90));
    student.insert(pair<string, int>("李四", 80));
    student.insert(pair<string, int>("王五", 70));

    return 0;
}

map 中查找:

// 声明一个string为key, int为value的map
#include <map>
#include <string>
using namespace std;

int main()
{
    map<string, int> student;

    // 向 map 中插入键值对
    student.insert(pair<string, int>("张三", 90));
    student.insert(pair<string, int>("李四", 80));
    student.insert(pair<string, int>("王五", 70));

    // 查找键值对
    map<string, int>::iterator it = student.find("张三");
    if (it != student.end())
    {
        cout << "张三的成绩为:" << it->second << endl;
    }

    return 0;
}

map的常用操作

插入元素

插入元素可以使用 insert 函数或 [] 运算符。

使用 insert 函数:

student.insert(pair<string, int>("张三", 90));

使用 [] 运算符:

student["张三"] = 90;

删除元素

使用 erase 函数可以删除元素:

student.erase("张三");

查找元素

使用 find 函数查找元素:

map<string, int>::iterator it = student.find("张三");
if (it != student.end())
{
    cout << "张三的成绩为:" << it->second << endl;
}

获取元素数量

使用 size 函数获取元素数量:

int n = student.size();

示例一:统计单词出现次数

下面是一个利用 map 统计单词出现次数的示例代码。

#include <iostream>
#include <map>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    string text = "hello world hello";
    map<string, int> word_count;
    istringstream iss(text);
    string word;
    while (iss >> word)
    {
        ++word_count[word];
    }
    for (const auto& pair : word_count)
    {
        cout << pair.first << "出现了" << pair.second << "次" << endl;
    }
    return 0;
}

输出结果:

hello出现了2次
world出现了1次

示例二:拼图游戏

下面是一个利用 map 实现拼图游戏的示例代码。

#include <iostream>
#include <map>
using namespace std;

const int n = 3;
int a[n][n] = {
    {2, 1, 5},
    {3, 0, 4},
    {7, 8, 6}
};

const int dir[][2] = {
    {-1, 0},
    {1, 0},
    {0, -1},
    {0, 1}
};

int hash()
{
    int h = 0;
    for (int i=0; i<n; ++i)
    {
        for (int j=0; j<n; ++j)
        {
            h = h * 10 + a[i][j];
        }
    }
    return h;
}

int main()
{
    map<int, string> dir_map;
    dir_map[0] = "up";
    dir_map[1] = "down";
    dir_map[2] = "left";
    dir_map[3] = "right";

    map<int, pair<int, int>> pos;
    for (int i=0; i<n; ++i)
    {
        for (int j=0; j<n; ++j)
        {
            pos[a[i][j]] = make_pair(i, j);
        }
    }

    map<int, string> ans_map;
    ans_map[hash()] = "";

    bool flag = false;
    string ans;
    while (!ans_map.empty())
    {
        map<int, string>::iterator it = ans_map.begin();
        int h = it->first;
        string str = it->second;
        ans_map.erase(it);
        int x, y;
        for (int i=0; i<n; ++i)
        {
            for (int j=0; j<n; ++j)
            {
                if (a[i][j] == 0)
                {
                    x = i;
                    y = j;
                    break;
                }
            }
        }

        for (int i=0; i<4; ++i)
        {
            int nx = x + dir[i][0];
            int ny = y + dir[i][1];
            if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
            swap(a[x][y], a[nx][ny]);  // 交换位置
            int h2 = hash();  // 计算hash值
            if (!ans_map.count(h2))  // 如果该状态没有出现过
            {
                ans_map[h2] = str + dir_map[i];  // 记录答案
            }
            if (h2 == 123456780)  // 找到目标状态
            {
                ans = ans_map[h2];
                flag = true;
                break;
            }
            swap(a[x][y], a[nx][ny]);   // 恢复状态
        }
        if (flag) break;
    }

    cout << ans << endl;

    return 0;
}

输出结果:

rightdownright

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的STL中map用法详解(零基础入门) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 易语言实现自动发送QQ信息的代码

    易语言实现自动发送QQ信息的代码攻略 1. 准备工作 在开始编写代码之前,需要确保已经安装了易语言开发环境,并且已经登录了QQ账号。 2. 创建新项目 打开易语言开发环境,点击\”新建\”按钮创建一个新项目。 3. 添加控件 在项目中添加一个按钮控件和一个编辑框控件,用于输入要发送的QQ号码和消息内容。 4. 编写代码 在按钮的点击事件中编写代码,实现自动发…

    other 2023年7月29日
    00
  • linux vim配置文件(经典实用,值得珍藏)

    Linux vim配置文件 (经典实用,值得珍藏) 简介 vim 是一款经典的文本编辑器,被广泛应用于 Linux 系统中。由于其高效简洁的操作方式和强大的功能,vim 在程序员、系统管理员等技术领域被广泛使用。然而,vim 默认的配置不一定能够满足我们的需求,因此,我们需要对其进行配置,以便更好地发挥其强大的编辑能力。 本文将详细讲解如何进行 vim 的配…

    other 2023年6月25日
    00
  • Linux系统的服务器上Samba服务器端的配置教程

    当我们在Linux服务器上配置Samba服务器端时,需要进行以下步骤: 安装Samba 使用以下命令安装Samba: sudo apt-get install samba 配置Samba 1. 创建共享目录 创建一个共享目录,为了方便起见,我们将使用一个名为share的目录。使用以下命令进行创建: sudo mkdir -p /srv/samba/share…

    other 2023年6月27日
    00
  • vue loadmore 组件滑动加载更多源码解析

    以下是“vue loadmore 组件滑动加载更多源码解析”的完整攻略。 1. 前言 在现代 Web 开发中,无限滚动加载更多已经成为了非常普遍的功能需求。Vue 是一款非常流行的前端框架,它提供了丰富的组件机制,使得开发者能够非常方便地实现无限滚动加载更多功能。 本篇攻略主要介绍一个基于 Vue 的 Loadmore 组件,该组件可以在滑动页面时自动触发加…

    other 2023年6月25日
    00
  • 详解C语言通过递归与非递归实现蛇形矩阵

    详解C语言通过递归与非递归实现蛇形矩阵 简介 本文将介绍如何使用C语言通过递归与非递归两种方法来实现蛇形矩阵的生成,其中包括蛇形矩阵的概念、递归与非递归的具体实现思路及其核心代码。 蛇形矩阵的概念 蛇形矩阵,也称之为异型矩阵,是一种特殊的矩阵排列形式,其按照行和列的交错顺序填充数据。如下所示的蛇形矩阵: 1 2 3 4 8 7 6 5 9 10 11 12 …

    other 2023年6月27日
    00
  • U盘分配单元大小怎么设置?U盘分配单元大小设置方法

    U盘分配单元大小指的是U盘格式化时每个文件占据的空间大小,它对于U盘的文件存储和传输有很大的影响。因此,如何设置U盘分配单元大小,是每个需要使用U盘的人都需要了解的知识点。以下是设置U盘分配单元大小的完整攻略,详细讲解了设置U盘分配单元大小的方法和注意事项。 设置U盘分配单元大小的方法 方法一:使用Windows自带的磁盘管理工具 将U盘插入电脑,打开“我的…

    other 2023年6月28日
    00
  • 重新应用默认的安全设置 : 安全配置和分析

    重新应用默认的安全设置通常用于恢复系统的安全设置到默认状态,以移除之前可能被修改或破坏的设置,从而使得系统恢复到安全的状态。 下面是详细说明重新应用默认的安全设置的完整攻略: 1. 打开组策略编辑器 点击开始菜单,在搜索框中输入 gpedit.msc,打开本地组策略编辑器。 2. 导航到安全配置和分析 在组策略编辑器中,依次展开以下结构:计算机配置 -&gt…

    other 2023年6月25日
    00
  • 微信小程序page的生命周期和音频播放及监听实例详解

    下面我将详细讲解“微信小程序page的生命周期和音频播放及监听实例详解”的完整攻略。 微信小程序 page 的生命周期 微信小程序 page 是小程序的基本页面,具有生命周期,可以用于页面的初始化和页面的状态管理等。下面是小程序 page 的生命周期方法: onLoad(options)在页面加载时触发,options 是页面参数,可以通过 this.dat…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部