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

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日

相关文章

  • pxcook(像素大厨)

    PxCook(像素大厨)攻略 PxCook(像素大厨)是一款设计师必备的UI设计工具,它可以帮助设计师快速生成设计稿的标注、切图、交互等工作,提高设计率。下面是PxCook的完整攻略,包括安装、使用和示例说明。 安装 PxCook支持Windows和Mac系统,可以在官网下载安装包进行安装。安装完成后,打开PxCook,输入注册码或使用试用版即可开始使用。 …

    other 2023年5月5日
    00
  • chrome谷歌浏览器:您使用的是不受支持的命令行标记:–extensions-on-chrome-urls

    首先,这个命令行标记是指在Chrome浏览器中启用扩展程序管理器的URL,以便为您的扩展程序提供更多的访问和管理权限。但是,这个命令行标记在目前的Chrome版本中已经不受支持了,所以当您尝试使用该标记时,Chrome浏览器会提示“您使用的是不受支持的命令行标记:–extensions-on-chrome-urls”。 要解决这个问题,您可以尝试下面的解决…

    other 2023年6月26日
    00
  • iOS中UIScrollView嵌套UITableView的实践教程

    iOS中UIScrollView嵌套UITableView的实践教程 在iOS开发中,有时候我们需要在一个UIScrollView中嵌套一个UITableView,以实现更复杂的界面布局和滚动效果。本教程将详细介绍如何实现这一功能,并提供两个示例说明。 步骤一:创建UIScrollView和UITableView 首先,在你的视图控制器中创建一个UIScro…

    other 2023年7月28日
    00
  • 解决Springboot @Autowired 无法注入问题

    解决 SpringBoot @Autowired 无法注入问题 在使用 SpringBoot 进行开发时,经常会使用到依赖注入,但有时会遇到 @Autowired 注解无法注入的问题。本文将介绍两种解决办法。 确认包扫描路径是否正确 在 SpringBoot 中,会默认扫描 @SpringBootApplication 注解所在的包及其子包下的 Java 类…

    other 2023年6月27日
    00
  • jquery制作省份城市地区多选控件总结

    以下是详细的“jquery制作省份城市地区多选控件总结的完整攻略,过程中至少包含两条示例说明”。 问题描述 在Web开发中,省份城市地区多选控件是一种常见的UI组件,用于选择多个省份、城市或地区。本文将介绍如何使用jQuery制作省份城市地区多选控件,包括两个示例说明。 解决方法 在jQuery中,我们可以使用以下步骤制作省份城市地区多选控件: 创建HTML…

    other 2023年5月7日
    00
  • steam连接服务器错误怎么办 steam连不上服务器请稍后重试的解决办法

    如果 Steam 在连接服务器时出现错误,可能无法登录并使用 Steam 平台。下面是解决此问题的一系列步骤: 第一步:检查 Steam 状态 检查Steam 状态页面,确保服务器不处于维护模式或出现故障。 第二步:检查网络连接 请确保您的网络连接正常,尝试重启您的路由器或调整您的网络设置。建议使用有线连接,而不是通过 Wi-Fi 连接网络。 第三步:清空 …

    other 2023年6月27日
    00
  • js(javascript)取float型小数点后两位数的方法

    以下是详细讲解“js(javascript)取float型小数点后两位数的方法的完整攻略,过程中至少包含两条示例说明”的标准Markdown文本: JS取float型小数点后两位数的方法 在JavaScript中,我们可以使用toFixed()方法来取float型小数点后两位数。同时,我们还可以使用正则表达式来实现这个功能。本攻略将介绍这两种方法同时提供两个…

    other 2023年5月10日
    00
  • word2pdf

    Word转PDF Word转PDF是一种将Word文档转换为PDF格式的方法,它可以帮助我们更方便地共享和打印文档。以下是Word转PDF的完整攻略。 步骤 以下是Word转PDF的步骤: 打开Word文档。 点击“文件”菜单选择“另存为”。 在“文件类型”下拉菜单中选择“PDF”。 点击“保存”按钮,将Word文档保存为PDF格式。 示例 以下是两个示例,…

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