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日

相关文章

  • c++-使用__int16(或int16_t)优于int的优点/缺点

    以下是关于“c++-使用__int16(或int16_t)优于int的优点/缺点”的详细讲解,包括基本概念、步骤和两个示例。 基本概念 在C++中,__int16和int16_t是两种可以代替int类型的数据类型。它们都是16位的整数类型,可以用来存储-32768到32767之间的整数。使用__int16或int16_t类型可以节省内存空间和提高程序性能。 …

    other 2023年5月7日
    00
  • dataset用法(1)

    当然,我很乐意为您提供有关“Dataset用法(1)”的完整攻略。以下是详细的步骤和两个示例: 1 Dataset Dataset是.NET Framework中的一个类,用于在内存中存储和操作数据。它可以从各种数据源中读取数据,如数据库、XML文件、CSV文件等,并将其存储在内存中。使用Dataset,可以方便地对数据进行查询、排序、过滤、更新等操作。 2…

    other 2023年5月6日
    00
  • css多种方式实现底部对齐

    当您需要在CSS中实现底部对齐时,有多种方法可以实现。以下是两种常用的方法: 1. 使用flexbox 使用flexbox是一种常用的方法,可以轻松地实现底部对齐。以下是使用flexbox实现底部对齐的步骤: 1.1 HTML结构 首先,我们需要一个包含所有内容的容器,以及一个要对齐到底部的元素。例如: <div class="contain…

    other 2023年5月6日
    00
  • Android自定义View简易折线图控件(二)

    Android自定义View简易折线图控件(二)攻略 简介 在本攻略中,我们将详细讲解如何创建一个简易的折线图控件,并自定义其外观和交互行为。我们将使用Android的自定义View来实现这个功能。 步骤 步骤一:创建自定义View类 首先,我们需要创建一个自定义View类来承载我们的折线图。这个类将继承自Android的View类,并重写一些必要的方法。 …

    other 2023年9月6日
    00
  • nagios服务端配置及客户的安装配置步骤分享[图文]

    下面是详细讲解“nagios服务端配置及客户的安装配置步骤分享[图文]”的完整攻略。 Nagios服务端配置及客户的安装配置步骤分享 1. 安装Nagios服务端 使用以下命令下载Nagios源代码: wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.6.tar.g…

    other 2023年6月27日
    00
  • 详解Java的内存模型

    详解Java的内存模型 Java的内存模型定义了Java程序中各种变量的访问规则和内存操作的行为。了解Java的内存模型对于编写高效且正确的多线程程序至关重要。本攻略将详细讲解Java的内存模型,包括内存模型的基本概念、内存间的交互规则以及如何使用volatile和synchronized关键字来保证线程安全。 基本概念 Java的内存模型将内存划分为主内存…

    other 2023年8月2日
    00
  • android日志输出到文件

    Android日志输出到文件 在Android应用程序的开发过程中,日志的输出是非常重要的。它能够帮助我们查找错误、调试程序以及了解用户的行为等。而且,在实际使用过程中,可能需要把日志输出到文件中,以方便查看和分析。本文将介绍如何在Android应用程序中实现将日志输出到文件的功能。 使用logcat命令 在Android系统中,可以使用logcat命令来查…

    其他 2023年3月28日
    00
  • STL priority_queue(优先队列)详解

    STL priority_queue(优先队列)详解 什么是 STL priority_queue? STL priority_queue 是一种基于堆的数据结构,用于实现优先队列,即能够按照特定的优先级顺序(默认为大顶堆)存储和访问元素。它是一个模板类,可以存储任何类型的数据,保证了插入元素和删除元素的时间复杂度都为 $O(logN)$。 如何使用 STL…

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