首页 > 其他分享 >114.STL中的map

114.STL中的map

时间:2023-07-23 14:45:28浏览次数:40  
标签:myrecipe map 元素 插入 STL contains bucket 114

114.STL中的map

1.map的简介

map是C++STL中的一个关联式容器,它提供一对一的hash,它类似于Python中的字典,也有着键值对(Key-Value)这一说。我们可以通过键(Key)来找到值(Value),但需要注意的是,每个键(Key)只能在map中出现一次哦!

map可以储存多种类型的数据,它主要用于一对一映射的情况,map内部的实现是通过自建一颗红黑树,这颗树可以对数据进行自动排序。所以在map内部所有的数据都是有序的,这个功能以后可以方便我们解决很多问题。

使用map时需要包含头文件:

#include<map>

2.map的定义及初始化

定义map<数据类型1,数据类型2>变量名
例:

//map的定义 
map<int,int> m1; //定义一个Key数据类型为int,Value数据类型为int的map容器m1 
map<double,double> m2; //定义一个Key数据类型为double,Value数据类型为double的map容器m2 
map<int,string> m3; //定义一个Key数据类型为int,Value数据类型为string的map容器m3

3.迭代器

begin   返回指向容器起始位置的迭代器(iterator) 
end      返回指向容器末尾位置的迭代器 
cbegin    返回指向容器起始位置的常迭代器(const_iterator) 
cend    返回指向容器末尾位置的常迭代器 

代码:

//unordered_map::bucket_count
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main()
{
    unordered_map<string, string> mymap =
    {  
        {"house", "maison"},      
        {"apple", "pomme"},   
        {"tree", "arbre"},
        {"book", "livre"},
        {"door", "porte"},
        {"grapefruit", "pamplemousse"}
    };
  
    /************begin和end迭代器***************/
    cout << "mymap contains:";
  
    for (auto it = mymap.begin(); it != mymap.end(); ++it)
        cout << " " << it->first << ":" << it->second;
    cout << endl;

    /************bucket操作***************/
    unsigned n = mymap.bucket_count();
    cout << "mymap has " << n << " buckets.\n";
    for (unsigned i = 0; i < n; ++i)
    {
        cout << "bucket #" << i << "'s size:" << mymap.bucket_size(i) << " contains: ";
        for (auto it = mymap.begin(i); it != mymap.end(i); ++it)
             cout << "[" << it->first << ":" << it->second << "] ";
        cout << "\n";
    }
    cout << "\nkey:'apple' is in bucket #" << mymap.bucket("apple") << endl;
    cout << "\nkey:'computer' is in bucket #" << mymap.bucket("computer") << endl;

    return 0;
}

输出:

mymap contains: house:maison apple:pomme tree:arbre book:livre door:porte grapefruit:pamplemousse
mymap has 8 buckets.
bucket #0's size:1 contains: [book:livre]
bucket #1's size:1 contains: [door:porte]
bucket #2's size:1 contains: [grapefruit:pamplemousse]
bucket #3's size:1 contains: [house:maison]
bucket #4's size:0 contains:
bucket #5's size:1 contains: [tree:arbre]
bucket #6's size:0 contains:
bucket #7's size:1 contains: [apple:pomme]

key:'apple' is in bucket #7

key:'computer' is in bucket #0

4.Capacity操作

size     返回有效元素个数 
max_size  返回 unordered_map 支持的最大元素个数 
empty      判断是否为空 

5.元素访问

operator[]       访问元素 
at         访问元素 
#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<int, string> m1;
	m1[1] = "ctx";
	m1[2] = "cxt";
	m1[3] = "txc";
	m1[10] = "txt";
	m1[5] = "666";
	map<int, string>::iterator it;
	for (it = m1.begin(); it != m1.end(); it++)
	{
		cout << it->first << " " << it->second << endl;
	}
	//it->为Key,it->second为Value 

	return 0;
}

输出:

1 ctx
2 cxt
3 txc
5 666
10 txt

6.查找

unordered_map<string, double>::const_iterator got = myrecipe.find("coffee");

if (got == myrecipe.end())
    cout << "not found";
else
    cout << "found " << got->first << " is " << got->second << "\n\n";

7.元素修改

insert    插入元素 
erase   删除元素 
swap    交换内容 
clear     清空内容 
emplace  构造及插入一个元素 
emplace_hint 按提示构造及插入一个元素 

插入:

unordered_map < string, double> myrecipe, mypantry = { {"milk",2.0},{"flour",1.5} };
/****************插入*****************/

pair<string, double> myshopping("baking powder", 0.3);
myrecipe.insert(myshopping);                        // 复制插入
myrecipe.insert(make_pair<string, double>("eggs", 6.0)); // 移动插入
myrecipe.insert(mypantry.begin(), mypantry.end());  // 范围插入
myrecipe.insert({ {"sugar",0.8},{"salt",0.1} });    // 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
myrecipe["coffee"] = 10.0;  //数组形式插入
 myrecipe.emplace("apple", 5.0);//构造及插入一个元素 

删除:

myrecipe.erase(myrecipe.begin());  //通过位置
myrecipe.erase("milk");    //通过key
display(myrecipe, "After erase myrecipe contains:");

交换:

myrecipe.swap(mypantry);
display(myrecipe, "After swap with mypantry, myrecipe contains:");

修改:

/****************修改*****************/
myrecipe.at("coffee") = 9.0;
myrecipe["milk"] = 3.0;
display(myrecipe, "After modify myrecipe contains:");

清空:

myrecipe.clear();
display(myrecipe, "After clear, myrecipe contains:");

完整代码:

// unordered_map::insert
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

void display(unordered_map<string, double> myrecipe, string str)
{
    cout << str << endl;
    for (auto& x : myrecipe)
        cout << x.first << ": " << x.second << endl;
    cout << endl;
}

int main()
{
    unordered_map < string, double> myrecipe, mypantry = { {"milk",2.0},{"flour",1.5} };
    /****************插入*****************/

    pair<string, double> myshopping("baking powder", 0.3);
    myrecipe.insert(myshopping);                        // 复制插入
    myrecipe.insert(make_pair<string, double>("eggs", 6.0)); // 移动插入
    myrecipe.insert(mypantry.begin(), mypantry.end());  // 范围插入
    myrecipe.insert({ {"sugar",0.8},{"salt",0.1} });    // 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
    myrecipe["coffee"] = 10.0;  //数组形式插入
    myrecipe.emplace("apple", 5.0);

    display(myrecipe, "myrecipe contains:");
    /****************查找*****************/
    unordered_map<string, double>::const_iterator got = myrecipe.find("coffee");

    if (got == myrecipe.end())
        cout << "not found";
    else
        cout << "found " << got->first << " is " << got->second << "\n\n";

    /****************修改*****************/
    myrecipe.at("coffee") = 9.0;
    myrecipe["milk"] = 3.0;
    display(myrecipe, "After modify myrecipe contains:");

    /****************擦除*****************/
    myrecipe.erase(myrecipe.begin());  //通过位置
    myrecipe.erase("milk");    //通过key
    display(myrecipe, "After erase myrecipe contains:");

    /****************交换*****************/
    myrecipe.swap(mypantry);
    display(myrecipe, "After swap with mypantry, myrecipe contains:");

    /****************清空*****************/
    myrecipe.clear();
    display(myrecipe, "After clear, myrecipe contains:");

    return 0;
}

输出:

found coffee is 10

After modify myrecipe contains:
baking powder: 0.3
eggs: 6
flour: 1.5
apple: 5
milk: 3
sugar: 0.8
salt: 0.1
coffee: 9

After erase myrecipe contains:
eggs: 6
flour: 1.5
apple: 5
sugar: 0.8
salt: 0.1
coffee: 9

After swap with mypantry, myrecipe contains:
milk: 2
flour: 1.5

After clear, myrecipe contains:

8.操作

find       通过给定主键查找元素,没找到:返回unordered_map::end
count      返回匹配给定主键的元素的个数 
equal_range   返回值匹配给定搜索值的元素组成的范围 

9.Buckets

bucket_count    返回槽(Bucket)数 
max_bucket_count    返回最大槽数 
bucket_size       返回槽大小 
bucket       返回元素所在槽的序号 
load_factor     返回载入因子,即一个元素槽(Bucket)的最大元素数 
max_load_factor    返回或设置最大载入因子 
rehash       设置槽数 
reserve        请求改变容器容量

参考:[详细介绍C++STL:unordered_map](详细介绍C++STL:unordered_map - 朤尧 - 博客园 (cnblogs.com))

标签:myrecipe,map,元素,插入,STL,contains,bucket,114
From: https://www.cnblogs.com/codemagiciant/p/17574983.html

相关文章

  • springboot项目报错找不到mapper文件
    在使用SpringBoot中的MyBatis-Plus(简称MP)时,出现无法找到mapper.xml文件的错误,可能有以下几个原因:1.未正确配置mapper.xml文件路径:在SpringBoot中,可以通过在application.properties或application.yml文件中设置mybatis-plus.mapper-locations属性来指定mapper.xm......
  • java: 找不到符号 符号: 方法 findSql6(java.util.Map<java.lang.String,java.lan
    解决"java:找不到符号符号:方法findSql6(java.util.Map<java.lang.String,java.lan"错误作为经验丰富的开发者,当遇到编译错误时,我们需要仔细分析错误信息并采取相应的解决方法。在这个任务中,我们需要解决"java:找不到符号符号:方法findSql6(java.util.Map<java.lang.St......
  • 113.STL中的pair
    113.STL中的pair1.pair的简介pair是C++STL(标准模板库)中的一个现有容器,它将2个数据整合成一组数据,当我们类似需求的时候就可以使用到pair啦!pair其实有点像Python中字典中的键值对(Key-Value),一个Key对应着一个Value。pair的本质其实就是个结构体,它含有两个成员变量first和second。......
  • map.xml文件报The content of element type "mapper" must match "(cache-ref|cache|r
    出现这个问题 是因为  <insert></insert>  <delete></delete>  <update></update>  <select></select>等标签写的不完整或者写错位置了比如<insert></insert>只写了一个,没有写结尾</insert>或者<insert></insert>中的</in......
  • C++ stl锁的使用
    我们在日常开发中经常要用到锁,这里记录一下实际开发过程中stl提供的锁的使用。1、读写锁读写锁算是用到的比较多的一种类型,主要实现对于同一个共享数据区,一个时间点只能有一个线程进行写(增删改),但可以有多个线程同时读(查)。换句话说,当有一个线程写的时候,其他线程(不管是读线程还是......
  • Map,Set
    MapMap对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值。//创建Map只能通过newconstmyMap=newMap([[1,'one'],[2,'two'],[3,'three'],]);constmap1=newMap();map1.set('a',1);map1.set('b......
  • 112.STL中的array
    112.STL中的array1.array介绍在C++标准库中,array是固定大小的序列容器,array中包含特定个数并且严格按照线性序列排序的元素。因此array允许对元素进行随机访问,指向某一元素的指针可以通过偏移访问其他元素。在array内部,它只保存自己包含的元素,其他任何信息都不保存,包括自身的大......
  • Unity编辑模式 一键获取Tilemap的格子信息
    动机由于地图是使用unitytilemap编辑的,服务端也希望获取一份相关的信息。相较于自己写个编辑器,直接利用unity的能力会更加敏捷。效果展示只需要将组件拖拽到含有Tilemap组件的GameObj上面,就可以点击按钮,获取格子信息。源码展示[CustomEditor(typeof(TilemapTool))][CanEdi......
  • 内核映射器(KernelMapper)开发-扩展KdMapper在Window 7 x64的支持
    1、背景  内核映射器有较多年历史了,其中KdMapper是比较著名的,原版中它使用intel的驱动漏洞可以无痕的加载未经签名的驱动。只不过当前只支持在Win10及Win11上运行,现在进行功能的修改以支持在Win7x64环境上。当前假定读者对KdMapper的原理比较了解并编译调试过相关代码。 2......
  • Java8、Java11新特性/Stream/MapReduce
    Q:如果题目里出现了java8的特性,然后问题问你下面哪个命令编译无错那么看下是不是有-java-source8-Xlint:all,是的话就选-source8。Q:JDK8中内置了哪些注解?A:@Override(重点)@Deprecated(重点)@SuppressWarnnings(重点)@SafeVarargs(JDK7引入)@FunctionalInterface(JDK8引入)Q:......