c++中map的基本用法和嵌套用法实例分析

C++中map的基本用法和嵌套用法实例分析

什么是map?

map是C++ STL中的一个关联容器,其内部实现是“红黑树”,可以实现快速查找,查找效率高于vector和deque。

map容器中的元素以键值对的形式存储,支持根据键快速查找值,键和值可以是任意类型,但是键必须是可以比较的。

map的基本用法

创建map容器

#include <map>

std::map<int, std::string> myMap;

上述代码创建了一个map容器,其中键的类型为int,值的类型为string。

插入元素

可以使用insert函数向map容器中插入元素:

myMap.insert(std::make_pair(1, "One"));

也可以使用以下方式直接访问map的下标:

myMap[1] = "One";

删除元素

使用erase函数删除map容器中的元素:

myMap.erase(1);

查找元素

可以使用find函数查找元素:

std::map<int, std::string>::iterator iter = myMap.find(1);

如果找到了,则iter指向对应的键值对;否则,iter指向end()函数返回的迭代器。

遍历元素

使用迭代器遍历map容器中的元素:

for (std::map<int, std::string>::iterator iter = myMap.begin(); iter != myMap.end(); ++iter) {
    std::cout << "Key: " << iter->first << ", Value: " << iter->second << std::endl;
}

map的嵌套用法

map可以作为另一个map的值,从而实现嵌套的效果。

创建嵌套map容器

std::map<int, std::map<int, std::string>> myNestedMap;

插入元素

向嵌套map容器中插入元素时,需要指定两个键值:

myNestedMap[1][1] = "One:One";

删除元素

同样使用erase函数删除嵌套map容器中的元素:

myNestedMap[1].erase(1);

查找元素

查找嵌套map容器中的元素时,需要按照两个键值一一查找:

std::map<int, std::map<int, std::string>>::iterator iter1 = myNestedMap.find(1);
if (iter1 != myNestedMap.end()) {
    std::map<int, std::string>::iterator iter2 = iter1->second.find(1);
    if (iter2 != iter1->second.end()) {
        std::cout << "Key1: " << iter1->first << ", Key2: " << iter2->first << ", Value: " << iter2->second << std::endl;
    }
}

遍历元素

使用双重循环遍历嵌套map容器中的元素:

for (std::map<int, std::map<int, std::string>>::iterator iter1 = myNestedMap.begin(); iter1 != myNestedMap.end(); ++iter1) {
    for (std::map<int, std::string>::iterator iter2 = iter1->second.begin(); iter2 != iter1->second.end(); ++iter2) {
        std::cout << "Key1: " << iter1->first << ", Key2: " << iter2->first << ", Value: " << iter2->second << std::endl;
    }
}

示例1:统计字符串中每个字符出现的次数

以下代码统计字符串“hello, world”中每个字符出现的次数:

#include <iostream>
#include <map>

int main() {
    std::string str = "hello, world";
    std::map<char, int> charCount;
    for (char c : str) {
        if (c != ' ') {
            charCount[c]++;
        }
    }
    for (std::map<char, int>::iterator iter = charCount.begin(); iter != charCount.end(); ++iter) {
        std::cout << iter->first << ": " << iter->second << std::endl;
    }
    return 0;
}

输出结果为:

,: 1
d: 1
e: 1
h: 1
l: 3
o: 2
r: 1
w: 1

示例2:多个map容器的嵌套实现棋盘

以下代码构建一个9x9的棋盘,其中黑子用字母“B”表示,白子用字母“W”表示:

#include <iostream>
#include <map>

const int BOARD_SIZE = 9;

int main() {
    std::map<int, std::map<int, std::string>> board;
    for (int i = 1; i <= BOARD_SIZE; ++i) {
        for (int j = 1; j <= BOARD_SIZE; ++j) {
            if (i % 2 == 0) {
                board[i][j] = (j % 2 == 0) ? "W" : "B";
            } else {
                board[i][j] = (j % 2 == 0) ? "B" : "W";
            }
        }
    }
    for (int i = 1; i <= BOARD_SIZE; ++i) {
        for (int j = 1; j <= BOARD_SIZE; ++j) {
            std::cout << board[i][j];
        }
        std::cout << std::endl;
    }
    return 0;
}

输出结果为:

BWBWBWBWB
WBWBWBWBW
BWBWBWBWB
WBWBWBWBW
BWBWBWBWB
WBWBWBWBW
BWBWBWBWB
WBWBWBWBW
BWBWBWBWB

以上就是关于C++中map的基本用法和嵌套用法实例分析的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++中map的基本用法和嵌套用法实例分析 - Python技术站

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

相关文章

  • Python自然语言处理 – 系列四

    Python自然语言处理-系列四的完整攻略 本文将为您详细讲解Python自然语言处理-系列四的完整攻略,包括文本分类、情感分析等内容。在文中,我们将介绍如何使用Python进行文本分类和情感分析,并提供两个示例说明。 文本分类 文本分类是自然语言处理中的一个重要任务,它可以将文本分为不同的类别。以下是使用Python进行文本分类的步骤: 收集数据。 收集需…

    other 2023年5月6日
    00
  • 谈一谈基于python的面向对象编程基础

    基于Python的面向对象编程基础 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的方法组织在一起,形成对象。Python是一种支持面向对象编程的高级编程语言,提供了丰富的语法和特性来支持面向对象编程。 类和对象 在Python中,类是创建对象的蓝图或模板,对象是类的实例。类定义了对象的属…

    other 2023年10月15日
    00
  • java基于Socket做一个简单下载器

    Java基于Socket编写简单下载器攻略 1. 前言 在本文中,我们将使用Java编写一个基于Socket的简单下载器。通过本文,您将能够了解以下内容: Socket的基础概念及用法 HTTP协议的基础知识 文件IO、多线程的基础使用 如何编写一个简单的下载器 2. Socket基础 2.1 Socket概述 Socket是网络编程中的基础组件之一,主要用…

    other 2023年6月27日
    00
  • 关于JavaScript中name的意义冲突示例介绍

    关于JavaScript中name的意义冲突示例介绍 在JavaScript中,name是一个常见的属性,它可以用于不同的目的,但有时候可能会导致意义冲突。下面将介绍两个示例来说明这个问题。 示例一:函数的name属性与命名冲突 在JavaScript中,函数也是一种对象,它可以有一个name属性,用于表示函数的名称。然而,当函数的名称与其他变量或函数的名称…

    other 2023年8月8日
    00
  • Sql Server 2005的1433端口打开局域网访问和进行远程连接

    首先,需要确认Sql Server 2005已经正确安装并且正常运行。然后,需要打开1433端口。 以下是Sql Server 2005打开1433端口的详细步骤: 打开Sql Server 2005配置管理器。 点击左侧面板上的“Sql Server 2005网络配置”。 在右侧面板上,找到“协议”选项卡。 找到“TCP/IP”协议选项,并确保其为“启用”…

    other 2023年6月27日
    00
  • 升级macOS Big Sur 差点丢了我多年的珍藏文件(夹)!!!

    升级macOS Big Sur 差点丢了我多年的珍藏文件(夹)!!! 升级macOS Big Sur可能会导致文件丢失或损坏,因此在升级之前需要备份重要的文件。本文将为您提供升级macOS Big Sur的完整攻略,包括备份文件、升级系统、恢复文件等内容。 备份文件 在升级macOS Big Sur之前,需要备份重要的文件。以下是备份文件的步骤: 打开Fin…

    other 2023年5月6日
    00
  • 部属vue项目,访问路径设置非根,显示白屏的解决方案

    下面是针对“部署Vue项目,访问路径设置非根,显示白屏的解决方案”的完整攻略: 问题描述 在部署Vue项目时,如果访问路径设置为非根路径,如/subpath,则在访问页面时会出现白屏或404的情况。 解决方案 1. 在vue.config.js中设置publicPath 在Vue项目的配置文件vue.config.js中,可以通过设置publicPath来指…

    other 2023年6月27日
    00
  • mysql数据库优化原则

    下面是关于MySQL数据库优化原则的完整攻略,包括原则、方法和两个示例说明。 原则 MySQL数据库优化的原则包括以下几点: 优化查询语句: 查询语句是MySQL数据库的核心操作,需要优化查询语句以提高查询效率和减少资源消耗。 优化索引: 索引是MySQL数据库的重要组成部分,需要优化索引以提高查询效率和减少资源消耗。 优化表结构: 表结构是MySQL数据库…

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