C++ STL map

这篇具有很好参考价值的文章主要介绍了C++ STL map。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

map 中每一个元素都是一个 key-value 对,数据类型为 pair
std::pair 主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
pair 实质上是一个结构体,其主要的两个成员变量firstsecond ,这两个变量可以直接使用。

初始化一个 pair 可以使用构造函数,也可以使用 std::make_pair 函数,make_pair 函数的定义如下:
template pair make_pair(T1 a, T2 b) { return pair(a, b); }

一般 make_pair 都使用在需要 pair 做参数的位置,可以直接调用 make_pair 生成 pair 对象。

pair<string, int> student ("zhangsan", 17);  // name-age
student.first = "zhangsan"; 
student.second = 17; 

product3 = make_pair ("shoes",20.0);

Map、HashMap概念

  • MapSTL 的一个关联容器,以键值对存储的数据,其类型可以自己定义,每个关键字在 map 中只能出现一次,关键字不能修改。map 也可以说关于 key-value 的映射。
  • HashMap 是基于哈希表实现的,每一个元素是一个 key-value 对。以空间换时间,是存储 key-value 键值对的集合。

map、hashmap 的区别

  • hash_map 底层采用 hash 表存储,map 一般采用红黑树实现,所以 hash_mapkey 值是无序的,map 存储是有有序的。
  • map 的优点在于可以自动按照 Key 值进行排序,查找时间复杂度是log(n)hash_map 优点在于它各项操作的平均时间复杂度接近常数,即O(1).

引用头文件

#include <map>

初始化赋值

  1. 使用初始化列表初始化map,并添加若干键值对
std::map<KeyType, ValueType> myMap = {
    {key1, value1},
    {key2, value2},
    // more key-value pairs
};
  1. 使用插入操作逐个添加元素到map中
std::map<KeyType, ValueType> myMap;
myMap.insert(std::make_pair(key1, value1));
myMap.insert(std::make_pair(key2, value2));
// more insertions

map 自定义 key 类型

如果要将自定义类型作为 map 的键值,将 less<key> 模板类示例化,重载 operator() 函数
另外,可以根据 less 自定义 对 key 值进行特定排序

参考:https://blog.csdn.net/qq525003138/article/details/121306663

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

struct student{
    student(string str, int a) : name(str), age(a) {};
    bool operator==(const student& stu2) const {
        return stu2.name == name && stu2.age == age;
    }
    string name;
    int age;
};

struct CompareClass {
public:
	// 函数const限定修饰符一定不要丢,必须和less<Key> 模板类保持一致
	bool operator()(const student& key1, const student& key2) const {
        return key1.name == key2.name && key1.age == key2.age;
	}
};

int main() {
    struct student stu1 = {"zhangsan", 17};
    map<student, string, CompareClass> students = {make_pair(stu1, "13班")};
    for(auto x : students) {
        cout<< x.first.name << " " << x.first.age << "岁 " << x.second << endl;
    }
	return 0;
}

map 的 value 自定义数据类型

unordered_map 的 value 自定义数据类型时,无特殊操作,按照常见数据类型操作即可

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

struct student{
    student(string str, int a) : name(str), age(a) {};
    bool operator==(const student& stu2) const {
        return stu2.name == name && stu2.age == age;
    }
    string name;
    int age;
};

struct CompareClass {
public:
	// 函数const限定修饰符一定不要丢,必须和less<Key> 模板类保持一致
	bool operator()(const student& key1, const student& key2) const {
        return key1.name == key2.name && key1.age == key2.age;
	}
};

int main() {
    struct student stu1 = {"zhangsan", 17};
    map<string, student> students = {make_pair("13班", stu1)};
    for(auto x : students) {
        cout<< x.first << " " << x.second.name << " " << x.second.age << "岁 "  << endl;
    }
	return 0;
}

遍历

  1. 迭代器遍历
for ( auto it = name_Address.begin(); it != name_Address.end(); ++it )
        cout << " " << it->first << ":" << it->second;
  1. range for循环遍历
for ( auto x : name_Address )
        cout << " " << x.first << ":" << x.second;
  1. 通过 key 索引

迭代器

迭代器只只支持 ++ -- 操作文章来源地址https://www.toymoban.com/news/detail-676605.html

常用方法

方法 说明
at(key) 返回对与键 key 关联的映射值
begin( ) 返回一个迭代器,它引用映射的第一个元素
end( ) 返回一个迭代器,它指向映射中的 past-the-end 元素
cbegin( ) 返回一个常量迭代器,它引用映射的第一个元素
cend( ) 返回一个常量迭代器,它指向映射的 past-the-end 元素
rbegin( ) 返回一个反向迭代器,它指向容器 i 的最后一个元素
rend( ) 返回一个反向迭代器,它指向容器中第一个元素之前的理论元素。
count(key ) 返回与键 key 关联的映射值的数量
empty( ) 测试 map 是否为空
erase( m.begin() ) 从 m.begin() 移除映射的单个元素
find( key ) 查找与键 key 关联的元素如果找到就返回key的迭代器,找不到返回 end()
insert( key:value ) 通过在映射中插入新元素来扩展容器
size( ) 返回映射中存在的元素数

插入

  1. 构造时插入 pari 类型
pair<string, int> student ("zhangsan", 17);
student.insert (student1); 
student.insert (make_pair<string, int>("lisi", 18)); 
  1. 构造时插入 数组 类型
// 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
student.insert ({{"zhangsan", 17}, {"lisi", 18}});
  1. 数组形式插入
//数组形式插入
myrecipe["coffee"] = 10.0;
  1. 插入指定位置
 m.insert(m.begin(), pair<char, int>('a', 1));
 m2.insert(m1.begin(), m1.end());

查找 key

map<string, int>::iterator get = student.find ("zhangsan");

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

修改 value

student.at("zhangsan") = 18;
student["zhangsan"] = 17;

删除元素

// 1. 通过位置
student.erase(student.begin());

// 2. 通过key
student.erase("milk");

// 3. void erase (iterator first, iterator last);
auto it = m.begin();
++it, ++it;

m.erase(m.begin(), it);

清空元素

student.clear();

到了这里,关于C++ STL map的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】STL之map、set类源码剖析

    目录 概述 算法 源码 Iterator.h RBTree.h Map.h Set.h test.cpp map和set都是STL中的关联式容器,而vector、list、deque是序列式容器。 map是映像,set是集合,map元素的数据类型是std::pairK,V格式(key/value形成映像),set元素的数据类型只有key值。 map和set的实现是对红黑树的封装,map根据key值进行

    2024年02月02日
    浏览(40)
  • C++之STL整理(3)之map 用法(创建、赋值、方法)整理

    注:整理一些突然学到的C++知识,随时mark一下 例如:忘记的用法,新,新数据结构 提示:本文为 C++ 中 map构造、赋值、接口 的写法和举例   STL 中的map是一个关联容器,它存储的元素都是 键值对 (key-value pair),并且 根据键(key)自动排序的容器 。map不允

    2024年04月26日
    浏览(37)
  • 【C++】STL——set/multiset 和 map/multimap的使用

    在初阶阶段,我们已经接触过STL中的部分容器 比如:vector、list、deque、forward_list(C++11)等,这些容器统称为 序列式容器 ,因为其底层为线性序列的数据结构,里面存储的是元素本身。 而今天我们要学习的几个容器称为关联式容器,那什么是关联式容器?它与序列式容器有什

    2024年02月14日
    浏览(45)
  • C++高级编程——STL:list容器、set容器和map容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月25日
    浏览(47)
  • 【C++】 使用红黑树模拟实现STL中的map与set

    前面的文章我们学习了红黑树,也提到了C++STL中的map和set的底层其实就是用的红黑树来实现的(而map和set的使用我们前面也学过了)。 既然红黑树我们也学习过了,那这篇文章我们就用红黑树来简单实现一下STL中的map和set,重点是学习它的框架。 上一篇文章我们实现了红黑

    2024年02月12日
    浏览(31)
  • 【C++】STL——用一颗红黑树封装出map和set

    我们都知道set是K模型的容器,而map是KV模型的容器,但是它俩的底层都是用红黑树实现的,上篇博文中我们模拟实现了一颗红黑树,接下来将对其进行改造,继而用一颗红黑树封装出map和set。 本质上map和set其内部的主要功能都是套用了红黑树现成的接口,只是稍作改动即可

    2023年04月15日
    浏览(35)
  • 【C++练级之路】【Lv.17】【STL】set类和map类的模拟实现

    快乐的流畅:个人主页 个人专栏:《C语言》《数据结构世界》《进击的C++》 远方有一堆篝火,在为久候之人燃烧! STL库中的set类和map类,其底层原理都是 通过红黑树来实现 的。尽管set和map可以各自实现一棵红黑树,但是为了提高代码的复用率,STL库中将红黑树进行了一定

    2024年04月16日
    浏览(38)
  • C++:stl中set(multiset)和map(multimap)的介绍和使用

    本文主要从概念、常用接口和使用方法方面介绍set(multiset)和map(multimap)。 目录 一、概念介绍 1.关联式容器 2.键值对 3. 树形结构的关联式容器 二、set和multiset 1.set的介绍 2.set使用 1. set模板参数列表 2. set构造 3. set迭代器 4. set容量 5. set修改操作 6.set使用举例 3.multiset介绍 4.mul

    2024年02月08日
    浏览(41)
  • 【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

    vector/list/deque… 这些容器统称为 序列式容器 因为其底层为线性序列的数据结构 里面存储的是元素本身 map/set… 这些容器统称为 关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是key, value结构的键值对 在数据检索时比序列式容器效率更高 “键

    2024年02月03日
    浏览(47)
  • 【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]

    欢迎各位大佬们的关顾,本文将介绍unordered系列容器以及其中的两个重要成员: unordered_map 和 unordered_set 。unordered_map是一种无序的关联容器,它使用哈希表来存储键值对,并提供高效的插入、查找和删除操作。在本文中,我们将首先介绍unordered_map的基本概念和特点,然后详

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包