iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++深入分析STL中map容器的使用
  • 327
分享到

C++深入分析STL中map容器的使用

2024-04-02 19:04:59 327人浏览 八月长安
摘要

目录1、map容器2、map容器原理3、map容器函数接口4、使用示例1、map容器 map是c++ STL的一个关联容器,它提供一对一的数据处理能力。其中,各个键值对的键和值可以是

1、map容器

map是c++ STL的一个关联容器,它提供一对一的数据处理能力。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。

第一个可以称为关键字(key);

第二个可能称为该关键字的值(value);

该容器存储的都是 pair<const K, T> 类型(其中 K 和 T 分别表示键和值的数据类型)的键值对元素。

使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改。换句话说,map 容器中存储的各个键值对不仅键的值独一无二,键的类型也会用 const 修饰,这意味着只要键值对被存储到 map 容器中,其键的值将不能再做任何修改。

2、map容器原理

map容器的实现是自建了一颗红黑树,这颗树具有对数据自动排序的功能,在map内部所有的数据都是有序的

3、map容器函数接口

begin()返回指向map头部的迭代器

clear()删除所有元素

count()返回指定元素出现的次数

empty()如果map为空则返回true

end()返回指向map末尾的迭代器

equal_range()返回特殊条目的迭代器对

erase()删除一个元素

find()查找一个元素

get_allocator()返回map的配置器

insert()插入元素

key_comp()返回比较元素key的函数

lower_bound()返回键值>=给定元素的第一个位置

max_size()返回可以容纳的最大元素个数

rbegin()返回一个指向map尾部的逆向迭代器

rend()返回一个指向map头部的逆向迭代器

size()返回map中元素的个数

swap()交换两个map

upper_bound()返回键值>给定元素的第一个位置

value_comp()返回比较元素value的函数

#include<map>

map<key, value> m;//创建一个名为m的空map对象,其键和值的类型分别为key和value。

map<key, value> m(m2);//创建m2的副本m,m与m2必须有相同的键类型和值类型。

map<key, value> m(b,e);//创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair

//查

m.count(k);// 返回m中键值等于k的元素的个数。

m.find(k);// 如果m中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回结束游标end()。

//删

//迭代器刪除

iter = m.find("123");

m.erase(iter);

//用关键字刪除

int n = m.erase("123"); //如果刪除了會返回1,否則返回0

//用迭代器范围刪除 : 把整个map清空

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

//等同于m.clear()

m.erase(k); // 删除m中键为k的元素,返回size_type类型的值,表示删除元素的个数。

m.erase(p); // 从m中删除迭代器p所指向的元素,p必须指向m中确实存在的元素,而且不能等于m.end(),返回void类型。

m.erase(iterator first, iterator last); // 删除一个范围,返回void类型。

//插入

// 第一种 用insert函數插入pair

m.insert(pair<int, string>(000, "student_zero"));

// 第二种 用insert函数插入value_type数据

m.insert(map<int, string>::value_type(001, "student_one"));

// 第三种 用"array"方式插入

m[123] = "student_first";

m[456] = "student_second";

m.insert(e) ;

e是一个用在m上的value_type类型的值。如果键e.first不在m中,则插入一个值为e.second的新元素;如果该键在m中已存在,那么不进行任何操作。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。

m.insert(beg, end);

beg和end是标记元素范围的迭代器,对于该范围内的所有元素,如果它的键在m中不存在,则将该键及其关联的值插入到m。 返回void类型。

m.insert(iter, e);

e是value_type类型的值,如果e.first不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回一个迭代器,指向m中具有给定键的元素。 在添加新的map元素时,使用insert成员可避免使用下标操作符带来的副作用:不必要的初始化。

//在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:int nSize = mapStudent.size();

pair<map<int,string>::iterator,bool>Insert_Pair;

Insert_Pair=mapStudent.insert(map<int,string>::value_type(1, "student_one"));

我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。

4、使用示例

(1)插入

  • insert 函数插入 pair 数据

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

mapPerson.insert(pair < int,string > (1,"Jim"));

  • insert 函数插入 value_type 数据

mapPerson.insert(std::map < int, std::string > ::value_type (2, "Tom"));

mapPerson[3] = "Jerry";

(2)遍历

前向迭代器

	std::map < int ,std::string > ::iterator it;
    std::map < int ,std::string > ::iterator itEnd;
    it = mapPerson.begin();
    itEnd = mapPerson.end();
    while (it != itEnd) 
    {
		cout<<it->first<<' '<<it->second<<endl;  
		it++;
	}

反向迭代器

std::map < int, string > ::reverse_iterator iter;  
for(iter = mapPerson.rbegin(); iter != mapPerson.rend(); iter++) 
	cout<<iter->first<<"  "<<iter->second<<endl; 

数组形式

mapPerson.insert(std::map<int, std::string>::value_type (1, "Tom"));
mapPerson[2] = "Jim";
mapPerson[3] = "Jerry";
int nSize = mapPerson.size();
for(int n = 1; n <= nSize; n++)
	qDebug()<<QString::fromStdString(mapPerson[n]);

(3)查找

三种数据查找方法

第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了

第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,

分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first和 iterator->second分别代表关键字和存储的数据。

map<int ,string > ::iterator l_it;; 
   l_it = maplive.find(112);
   if(l_it == maplive.end())
                cout<<"we do not find 112"<<endl;
   else cout<<"wo find 112"<<endl;

第三种:这个方法用来判定数据是否出现,是显得笨了点,

lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)

upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)

例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,

而upper-bound(2)的话,返回的就是3

Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字,

#include <map>
#include <string> 
#include <iOStream>
using namespace std;
int main()
{
    map<int, string> mapStudent;
    mapStudent[1] = "student_one";
    mapStudent[3] = "student_three";
    mapStudent[5] = "student_five";
    map<int, string>::iterator iter;
    iter = mapStudent.lower_bound(1);
    //返回的是下界1的迭代器
        cout<<iter->second<<endl;
    iter = mapStudent.lower_bound(2);
    //返回的是下界3的迭代器
        cout<<iter->second<<endl;
    iter = mapStudent.lower_bound(3);
    //返回的是下界3的迭代器
        cout<<iter->second<<endl;
    iter = mapStudent.upper_bound(2);
    //返回的是上界3的迭代器
        cout<<iter->second<<endl;
    iter = mapStudent.upper_bound(3);
    //返回的是上界5的迭代器
        cout<<iter->second<<endl;
    pair<map<int, string>::iterator, map<int, string>::iterator> mappair;
    mappair = mapStudent.equal_range(2);
    if(mappair.first == mappair.second)
        cout<<"Do not Find"<<endl;
    else
        cout<<"Find"<<endl;
    mappair = mapStudent.equal_range(3);
    if(mappair.first == mappair.second)
        cout<<"Do not Find"<<endl;
    else
        cout<<"Find"<<endl;
    return 0;
}

(4)删除

iterator erase(iterator it)	;//通过一个条目对象删除
iterator erase(iterator first,iterator last);	//删除一个范围
size_type erase(const Key&key);	//通过关键字删除
clear();//就相当于enumMap.erase(enumMap.begin(),enumMap.end());

到此这篇关于C++深入分析STL中map容器的使用的文章就介绍到这了,更多相关C++STL中map容器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++深入分析STL中map容器的使用

本文链接: https://www.lsjlt.com/news/148265.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++深入分析STL中map容器的使用
    目录1、map容器2、map容器原理3、map容器函数接口4、使用示例1、map容器 map是C++ STL的一个关联容器,它提供一对一的数据处理能力。其中,各个键值对的键和值可以是...
    99+
    2022-11-13
  • C++浅析STL 迭代器 容器的使用
    目录STL定义STL六大组件vectorvector嵌套容器STL定义 STL(Standard Template Library 标准模板库)STL从广义上分为:容器(contai...
    99+
    2022-11-13
  • C++STL中vector容器的使用
    目录一、vector(1)区分size()和capacity()(2)迭代器失效(3)区分const_iterator和const iterator(4)区分reserve()和re...
    99+
    2022-11-13
  • C++中的STL中map用法详解(零基础入门)
    目录一、什么是 map ? 二、map的定义 2.1 头文件 2.2 定义 2.3 方法 三、实例讲解 3.1 增加数据 3.2 删除数据 3.3 修改数据 3.4 查找数据...
    99+
    2022-11-12
  • C++ STL容器中红黑树部分模拟实现的示例分析
    这篇文章主要介绍了C++ STL容器中红黑树部分模拟实现的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、红黑树的概念红黑树(Red Black Tree...
    99+
    2023-06-21
  • 如何在C++中使用 STL 顺序容器
    今天就跟大家聊聊有关如何在C++中使用 STL 顺序容器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C++ 标准模板库 STL 顺序容器容器数据结构顺序性重复性支持迭代器vecto...
    99+
    2023-06-15
  • Spring深入分析容器接口作用
    目录1.容器接口有哪些2.BeanFactory能干嘛3.ApplicationContext有哪些扩展功能3.1 MessageSource3.2 ResourcePatternR...
    99+
    2022-11-13
  • C++中map容器的具体使用
    目录一、map容器1.1 简介1.2 pair对组的创建1.3 map容器构造和赋值1.4 map容器大小和交换1.5 map容器插入和删除1.6 map容器查找和统计1.7 map...
    99+
    2023-05-13
    C++ map容器
  • C++中的map容器如何使用
    这篇“C++中的map容器如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中的map容器如何使用”文章吧。一、m...
    99+
    2023-07-05
  • C++深入分析内联函数的使用
    目录一、常量与宏回顾二、内联函数三、内联函数使用注意事项四、小结一、常量与宏回顾 C++中的const常量可以替代宏常数定义,如︰ 但是C++中是否有解决方替代宏代码片段呢?这里就...
    99+
    2022-11-13
  • C#中async和await的深入分析
    目录大概理解深入分析await和Wait()的区别去掉Task.Run的Wait小结其他.Await();总结大概理解 查了一个小时的资料:async和await 发现这个大神的解释...
    99+
    2022-11-13
    c# async和await c#异步编程
  • C++中指针,引用和STL的示例分析
    这篇文章主要介绍C++中指针,引用和STL的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对象的定义:对象是指一块能存储数据并具有某种类型的内存空间一个对象a,它有值和地址;运行程序时,计算机会为该对象分配存...
    99+
    2023-06-29
  • 深入浅析Docker容器中的Patroni
    目录创建镜像文件结构DockerFileentrypoint.shfunctiongeneratefile构建镜像运行镜像总结附图上一篇文章向大家介绍了Repmgr的搭建过程,实现了...
    99+
    2022-11-12
  • C语言深入分析函数与宏的使用
    目录一、函数与宏二、宏的妙用三、小结一、函数与宏 宏是由预处理器直接替换展开的,编译器不知道宏的存在函数是由编译器直接编译的实体,调用行为由编译器决定多次使用宏会导致最终可执行程序的...
    99+
    2022-11-13
  • 深入解析C++中的std::thread的使用
    目录std::thread简介一、C++11 线程创建二、std::thread 的构造函数中接收什么参数?三、std::thread 的搭配用法std::thread简介 C++1...
    99+
    2023-05-16
    C++ std::thread使用 C++ std::thread用法 C++ std::thread
  • C++ STL 序列式容器与配接器的简单使用
    目录容器概述序列式容器 array vector list deque forward_list Adapter(配接器) stack queue priority_queue 容器...
    99+
    2022-11-12
  • 如何理解Java容器中Map的源码分析
    本篇文章为大家展示了如何理解Java容器中Map的源码分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果没有特别说明,以下源码分析基于 JDK 1.8。一、HashMap为了便于理解,以下源码分...
    99+
    2023-06-05
  • C++深入刨析类与对象的使用
    目录this指针this指针存放在哪nullptr与类类的默认成员函数构造函数意义析构函数拷贝构造运算符重载this指针 现在给出一段代码,实现一个普通的日期 date 的打印: c...
    99+
    2022-11-13
  • 深入浅析Java中HashMap与HashTable容器的区别
    这篇文章给大家介绍深入浅析Java中HashMap与HashTable容器的区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、HashMap HashMap继承抽象类AbstractMap,实现接口Map、Clon...
    99+
    2023-05-31
    java hashmap hashtable
  • C++深入分析数据在内存中的存储形态
    目录一.整形在内存中的存储1.原码-反码-补码2.大小端介绍二.浮点型在内存中的存储1.浮点型的存储2.浮点型的读取一.整形在内存中的存储 1.原码-反码-补码 计算机中的整数有三种...
    99+
    2023-01-06
    C++数据在内存中的存储 C++数据存储
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作